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

时间:2014-01-08 05:02:08

标签: python numpy indexing cython unsigned-integer

这是this question的后续行动。

(为什么/何时)是否最好使用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 e。 G。一个unsigned int,因此我无法使用@cython.boundscheck(False)

2 个答案:

答案 0 :(得分:24)

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位架构。

答案 1 :(得分:18)

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

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