У меня в 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 как 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
" при попытке использовать его в vector[
;и у меня возникают трудности с преобразованием объектов Python в PyObject
("Cannot convert Python object to 'vector[PyObject]]
")
Я представляю, что в конечном итоге мне придется определить новый класс для этих строк с помощью специального оператора сравнения, потому что яне думайте, что утверждение равенства в PyObjects имеет смысл, даже если это строки. Тем временем, однако, что я могу сделать, чтобы передать строки в Cython как объекты Python?