Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython:(为什么/什么时候)使用Py_-ssize_-t索引更可取吗?_Python_Numpy_Indexing_Cython_Unsigned Integer - Fatal编程技术网

Python Cython:(为什么/什么时候)使用Py_-ssize_-t索引更可取吗?

Python Cython:(为什么/什么时候)使用Py_-ssize_-t索引更可取吗?,python,numpy,indexing,cython,unsigned-integer,Python,Numpy,Indexing,Cython,Unsigned Integer,这是一项后续行动 (为什么/何时)最好使用Py\u ssize\t进行索引?在我刚找到的 ->这是否意味着在索引NumPy/Cython-array/-视图时应始终使用Py\u ssize\t ->是Py\u-ssize\te。G一个无符号int,这样我就不能使用@cython.boundscheck(False)Py\u-ssize\t被签名。请参阅,其中显示“引入了一个新类型Py_ssize_t,它的大小与编译器的size_t类型相同,但已签名。如果可用,它将是ssize_t的typedef

这是一项后续行动

(为什么/何时)最好使用
Py\u ssize\t
进行索引?在我刚找到的

->这是否意味着在索引NumPy/Cython-array/-视图时应始终使用
Py\u ssize\t


->是
Py\u-ssize\t
e。G一个
无符号int
,这样我就不能使用
@cython.boundscheck(False)
Py\u-ssize\t
被签名。请参阅,其中显示“引入了一个新类型Py_ssize_t,它的大小与编译器的size_t类型相同,但已签名。如果可用,它将是ssize_t的typedef。”

您应该使用
Py\u ssize\t
进行索引。我在Cython文档中没有找到关于这一点的明确声明,但Cython开发人员Stefan Behnel在电子邮件()中也这么说:

一般来说,您使用int作为索引。你应该 改用Py\u ssize\u t类型(或size\u t,如果您喜欢 无符号类型)以正确适应64位体系结构


Py_ssize\u t
是CPython(Python的C实现——我这里不是说Cython,我是说CPython)实现中内部使用的一个typedef。pythoncapi函数接受或返回可用于索引Python序列的C级整数,在任何地方都可以使用它。这就是为什么它是用于索引的“正确”类型


Py\u ssize\u t
依次解析为平台C的无符号
size\t类型的有符号变体的平台拼写。因此,它是一些有符号整数类型,但其宽度(位数)取决于您使用的平台。

此外,来自Cython文档:“Py_ssize_t是Python数组索引的正确C类型。”>。。。或大小\u t,如果您喜欢无符号类型。。。值得指出的是,总的来说,这不是一个好主意。我见过一些代码因为没有检测到C Python库中某些函数返回的错误而崩溃,这些函数返回-1来表示错误,如果使用无符号类型,则会丢失错误。@BobKline建议专门对索引使用size\u t,而不是在任何地方使用int。(如果索引使用负值,它将以一种或另一种方式爆炸,无论是因为它隐式转换为无符号,还是因为我们从数组的开头开始索引。因此,我们最好使用保证能够表示所有有效索引的类型。)
# Purists could use "Py_ssize_t" which is the proper Python type for
# array indices.