Cython:(为啥/何时)最好使用 Py_ssize_t 进行索引?
Posted
技术标签:
【中文标题】Cython:(为啥/何时)最好使用 Py_ssize_t 进行索引?【英文标题】:Cython: (Why / When) Is it preferable to use Py_ssize_t for indexing?Cython:(为什么/何时)最好使用 Py_ssize_t 进行索引? 【发布时间】:2014-01-26 01:34:57 【问题描述】:这是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)
【问题讨论】:
另外,来自 Cython 文档:“Py_ssize_t 是 Python 数组索引的正确 C 类型。” 【参考方案1】: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 位架构。
【讨论】:
> ... 或 size_t,如果您更喜欢无符号类型... 值得指出的是,通常这不是一个好主意。我看到代码崩溃了,因为它没有检测到 C Python 库中的某些函数返回的错误,这些函数返回 -1 表示错误,如果您使用无符号类型,则会丢失。 @BobKline 建议将 size_t 用于 indices,而不是 everywhere 您可能会使用 int。 (如果一个负值被用于索引,它会以一种或另一种方式爆炸,无论是因为它被隐式转换为无符号,还是因为我们索引了数组的开头。所以我们不妨使用保证能够表示所有有效索引的类型。)【参考方案2】:Py_ssize_t
是 CPython 实现内部使用的 typedef(Python 的 C 实现 - 我不是在那里谈论 Cython,我在谈论 CPython)。它在 Python C API 函数接受或返回可用于索引 Python 序列的 C 级整数的任何地方使用。这就是为什么它是用于索引的“正确”类型。
Py_ssize_t
反过来解析为平台 C 的无符号 size_t
类型的 signed 变体的平台拼写。所以它是一些有符号整数类型,但它的宽度(位数)取决于您使用的平台。
【讨论】:
以上是关于Cython:(为啥/何时)最好使用 Py_ssize_t 进行索引?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在迭代 NumPy 数组时 Cython 比 Numba 慢得多?