在Python中,我有一个要传递给Cython的字符串列表。以前,我是通过将所有字符串都转换为bytes
,传递给Cython,然后将返回的结果转换回str
来实现的:
# script.py
stringlist = ["one","two","three","one"]
output = func(stringlist)
#cyfunc.pyx
from libcpp.string import string
from libcpp.vector import vector
cdef cfunc(vector[string] stringlist):
cdef string s
for s in stringlist:
...
# do something with the strings
def func(stringlist):
result = cfunc([s.encode('utf-8') for s in stringlist])
return [s.decode('utf-8') for s in result]
但是,由于除了声明它们之间的相等性之外,我实际上不需要对字符串做任何其他事情,因此我意识到我可以通过完全忽略转换步骤而将Python字符串作为{{ 1}}或str
:
PyObject
但是#cyfunc.pyx
from libcpp.vector cimport vector
from cpython.ref cimport PyObject
cdef cfunc(vector[PyObject] stringlist):
cdef PyObject s
for s in stringlist:
...
# do something with the strings
def func(stringlist):
return cfunc(stringlist)
在尝试在str
中使用时会出现错误“ Python object type 'unicode object' cannot be used as a template argument
”;而且我在将Python对象转换为vector[
(“ PyObject
”)时遇到困难
我想象最终我将不得不使用自定义比较运算符为这些字符串定义一个新类,因为我不认为在PyObjects上声明相等性是有意义的,即使它们是字符串也是如此。但是,与此同时,我该怎么做才能将字符串作为Python对象传递给Cython?
答案 0 :(得分:0)
这个问题的答案是:不要这样做。
Cython不适用于处理Python对象。如果要通过在Cython中抛出Python对象(包括Python字符串)来加快Python应用程序的运行速度,请查找其他地方。您不会在这里发现速度增加。
如果您需要进行字符串操作(甚至只是字符串比较),并且您正在使用Python3字符串对象,那么Cython并不是您的朋友。