Список Python для Cython
Я хочу знать, как преобразовать обычный список python в список C с Cython, обработать его и вернуть список python. Как:
Python script:
import mymodule
a = [1,2,3,4,5,6]
len = len(a)
print(mymodule.process(a,len))
Cython script (mymodule.pyd):
cpdef process(a, int len):
cdef float y
for i in range(len):
y = a[i]
a[i] = y * 2
return a
Я читал о MemoryView и многих других вещах, но я действительно не разбираюсь в том, что происходит, и много примеров используют Numpy (я не хочу использовать его для того, чтобы пользователь моего script загрузил большой пакет... в любом случае Я думаю, что это не работает с моим программным обеспечением). Мне нужен действительно простой пример, чтобы понять, что именно происходит.
Ответы
Ответ 1
Вам нужно скопировать содержимое списка в массив явно. Например...
cimport cython
from libc.stdlib cimport malloc, free
...
def process(a, int len):
cdef int *my_ints
my_ints = <int *>malloc(len(a)*cython.sizeof(int))
if my_ints is NULL:
raise MemoryError()
for i in xrange(len(a)):
my_ints[i] = a[i]
with nogil:
#Once you convert all of your Python types to C types, then you can release the GIL and do the real work
...
free(my_ints)
#convert back to python return type
return value