gpt4 book ai didi

python - Cython:什么时候应该将字符串定义为 char*、str 或 bytes?

转载 作者:太空狗 更新时间:2023-10-30 02:53:24 24 4
gpt4 key购买 nike

在 Cython + Python 3 中定义将保存字符串的变量类型时,我可以使用(至少):

cdef char* mystring = "foo"
cdef str mystring = "foo"
cdef bytes mystring = "foo"

documentation page on strings对此尚不清楚——它主要给出了使用 char* 和字节的示例,坦率地说,我很难理解它。

在我的例子中,字符串将来自 Python3 程序并假定为 unicode。它们将用作字典键和函数参数,但我不会对它们做进一步的操作。不用说,我正在努力最大限度地提高速度。

This question建议在 Python2.7 和没有 Unicode 的情况下,键入 str 会使字符串操作代码运行得比完全不键入要慢。 (但这在这里不一定相关,因为我不会做太多的字符串操作。)

每个选项的优点和缺点是什么?

最佳答案

如果没有对特定类型进行进一步处理,最好和最快的方法是完全不键入它们,这意味着它们被视为通用 PyObject *

str 类型是 special case这意味着 Python 2 上的 bytes 和 Python 3 上的 unicode

The str type is special in that it is the byte string in Python 2 and the Unicode string in Python 3

因此,将字符串键入 str 并将其作为 unicode 处理的代码将在 python 2 上中断,其中 str 表示 bytes.

只有在将字符串转换为 C char* 或 C++ std::string 时才需要键入字符串。在那里,您将使用 str 来处理 py2/py3 兼容性,以及用于转换为字节和 unicode 的辅助函数,以便能够转换为 char*std::string

字符串类型是为了与 C/C++ 的互操作性,而不是为了提高速度。 Cython 将在不复制的情况下自动将 bytes 字符串转换为 char*,例如当它看到类似 cdef char* c_string = b_string[:b_len] 的内容时 其中 b_string 是一个 bytes 类型。

OTOH,如果在没有使用该类型的情况下键入字符串,Cython 将在不需要时执行从对象到字节/unicode 的转换,这会导致开销。

这可以在生成为 Pyx_PyObject_AsStringPyx_PyUnicode_FromString 等的 C 代码中看到。

这在一般情况下也是正确的 - 经验法则是,如果不需要特定类型进行进一步处理/转换,最好根本不要键入它。 python 中的一切都是对象,因此键入将从通用目的 PyObject* 转换为更具体的内容。

关于python - Cython:什么时候应该将字符串定义为 char*、str 或 bytes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com