Cython :(为什么/何时)使用Py_ssize_t进行索引是否更可取?

emb*_*ert 34 python indexing numpy cython unsigned-integer

这是这个问题的后续行动.

(为什么/何时)是否更适合Py_ssize_t用于索引?在我刚发现的文档中

# Purists could use "Py_ssize_t" which is the proper Python type for
# array indices.
Run Code Online (Sandbox Code Playgroud)

- >这是否始终指的是索引NumPy/Cython - 数组/ - 应该使用的视图Py_ssize_t

- >是Py_ssize_t例如一个unsigned int,这样我可以不使用@cython.boundscheck(False)

War*_*ser 29

Py_ssize_t签了.请参阅PEP 353,其中显示"引入了一个新类型Py_ssize_t,它与编译器的size_t类型具有相同的大小,但是已签名.它将是ssize_t的typedef,如果可用的话."

您应该Py_ssize_t用于索引.我没有在Cython文档中找到明确的声明,但是Cython开发人员Stefan Behnel在电子邮件中说了很多(https://groups.google.com/forum/#!topic/cython-users/ brENF_M9zxM):

作为一般性评论,您使用整数作为索引.您应该使用Py_ssize_t类型(或者size_t,如果您更喜欢无符号类型)来适当地适应64位体系结构.


Tim*_*ers 20

Py_ssize_t是一个在CPython实现中内部使用的typedef(Python的C实现 - 我不是在谈论Cython,我在谈论CPython).它被用于Python C API函数接受或返回可用于索引Python序列的C级整数.这就是为什么它是用于索引的"正确"类型.

Py_ssize_t反过来解析为平台C的无符号类型的签名变体的平台拼写size_t.所以它是一些有符号整数类型,但它的宽度(位数)取决于你正在使用的平台.