Преобразовать список строк Python в вектор [PyObject] в Cython - PullRequest
0 голосов
/ 28 октября 2019

У меня в 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?

...