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 进行索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地将 C++/Cython 项目编译成可执行文件?

为啥在迭代 NumPy 数组时 Cython 比 Numba 慢得多?

在 cython 中返回 c++ 对象(最好不是指针)

使用 Cython 和 C++ 组织项目

为啥 Cython 编译器会生成带有后缀“cpython-35m-x86_64-linux-gnu.so”的 so

如何在 Cython 中正确管理 C++ 对象的生命周期?