Pythonで最も有名なライブラリの一つに、Numpy があります。Numpyは科学技術計算、機械学習、AI、画像処理など、多岐にわたる分野で利用され、今日のPythonの普及に大きく貢献しています。
Numpyは独立したライブラリですが、もともとはPythonの標準ライブラリに組み込む予定で開発が始まりました。しかし、プロジェクトが大規模化したため、最終的に独立したライブラリとして提供されることになりました。この経緯から、NumpyはPython言語と密接な関係を持ち、その設計や実装に大きな影響を与えてきました。
NumpyのArrayは多次元の行列演算を行う機能を提供していますが、ここで使用される行列のデータ形式は、Python言語仕様の一部として定められているバッファープロトコル に基づいています。このプロトコルにより、Numpy以外の数値演算ライブラリや、Python以外の言語で開発された数値演算処理でも、互換性の問題なく行列データを参照・更新することができます。これはNumpyを中心としたエコシステムの発展を大きく推進してきました。
バッファープロトコルと型ヒント¶
これまで、バッファープロトコルはC言語などで開発した拡張モジュールからは利用できましたが、Python言語からは直接アクセスできませんでした。そのため、型ヒントでもNumpyのArrayなどの「バッファープロトコルをサポートしているデータ」を型として表現することができませんでした。しかし、Python 3.12では、Python言語からもバッファープロトコルを利用できるようになり、型ヒントでも指定できるようになりました。
Python3.12では PEP 688: Making the buffer protocol accessible in Python が採用され、バッファープロトコルをサポートしているオブジェクトの抽象データ型として collections.abc.Buffer を利用できるようになりました。
from collections.abc import Buffer
import numpy as np
def printbufferinfo(buf:Buffer):
view = memoryview(buf)
print(f"データ形式: {view.format}")
print(f"形状: {view.shape}")
printbufferinfo(np.random.randint(0, 100, size=100)) # OK
printbufferinfo("こんにちは") # エラー: 文字列はバッファープロトコルを使えない
printbufferinfo("こんにちは".encode()) # OK