Я пытаюсь написать функцию на Cython для обработки большого количества строк.В приведенном ниже коде я пытаюсь преобразовать список объектов Unicode str
(в Python 3) в таблицу char*
, которая затем используется для поиска подстрок.
Я нашелрешение для Python 2 здесь , но это решение зависит от объекта PyString_AsString
, который доступен только в Python 2, тогда как в Python 3 мы должны использовать PyUnicode_AsUTF8
, который я обнаружил около здесь .Когда я пытался использовать PyUnicode_AsUTF8
, я сталкивался с этой ошибкой:
: 31: 16: 'PyUnicode_AsUTF8' не является константой, переменной или идентификатором функции
У меня практически нет идей.Все, что я пробую, вызывает какую-то ошибку.
Код
import cython
from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
from cpython.string cimport PyUnicode_AsUTF8
from libc.string cimport strstr
@cython.boundscheck(False)
def start(itsstr, tokens):
cdef size_t s
cdef size_t t
cdef size_t ns = len(itsstr)
cdef size_t nt = len(tokens)
cdef const char** t_str = _char_table(itsstr, ns)
cdef const char** t_tok = _char_table(tokens, nt)
cdef unicode x
for s in xrange(ns):
for t in xrange(nt):
if strstr(t_str[s], t_tok[t]):
x = itsstr[s]
PyMem_Free(t_str)
PyMem_Free(t_tok)
cdef const char** _char_table(s, const size_t n):
cdef char** t = <char**>PyMem_Malloc(n * sizeof(char*))
cdef size_t i = 0
for i in xrange(n):
temp = PyUnicode_AsUTF8(s[i])
t[i] = temp
return t