Python3.12の新機能 Python 3.12の新機能(その4) PEP 688: バッファープロトコルをPythonで利用可能に

PEP 701: f文字列の形式定義PEP 695: 型パラメータ文法その他の型ヒント関連機能PEP 688: バッファープロトコルをPythonで利用可能にPEP 684: インタープリター別GILPEP 683: 固定参照カウントによる永続オブジェクトPEP 709: 内包式のインライン化

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
Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索