web-dev-qa-db-ja.com

Cython:(なぜ/いつ)索引付けにはPy_ssize_tを使用する方が良いですか?

これは この質問 のフォローアップです。

(なぜ/いつ)索引付けに_Py_ssize_t_を使用することは望ましいですか? docs で見つけた

_# Purists could use "Py_ssize_t" which is the proper Python type for
# array indices.
_

-> NumPy/Cython-配列/ビューにインデックスを付けるときは常に_Py_ssize_t_を使用する必要があるという意味ですか?

->は_Py_ssize_t_です。 g。 _unsigned int_使用できないように@cython.boundscheck(False)

37
embert

Py_ssize_tが署名されています。 PEP 35 の説明を参照 "コンパイラのsize_t型と同じサイズであるが、署名されている新しい型Py_ssize_tが導入されました。利用可能なssize_tのtypedef。 "

索引付けにはPy_ssize_tを使用する必要があります。 Cythonのドキュメントでこれについての明確な説明は見つかりませんでしたが、Cython開発者のStefan Behnelがメールで同じように述べています( https://groups.google.com/forum/#!topic/ cython-users/brENF_M9zxM ):

一般的な注意として、インデックスとしてintを使用しています。 64ビットアーキテクチャに適切に対応するには、代わりにPy_ssize_t型(または、符号なしの型が必要な場合はsize_t)を使用する必要があります。

32

Py_ssize_tは、CPythonの実装で内部的に使用されるtypedefです(CのPython-私はnotここでCythonについて話している)、私はPython C API関数は、インデックスの作成に使用できるCレベルの整数を受け入れるか、または返しますPythonシーケンスです。それが理由です。インデックスに使用する「正しい」タイプ。

Py_ssize_tは、プラットフォームのスペルがsignedプラットフォームCの符号なしのsize_tタイプのバリアントに解決されます。したがって、これは符号付き整数型ですが、その幅(ビット数)は、使用しているプラ​​ットフォームによって異なります。

21
Tim Peters