Подтвердить что ты не робот

Список 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 загрузил большой пакет... в любом случае Я думаю, что это не работает с моим программным обеспечением). Мне нужен действительно простой пример, чтобы понять, что именно происходит.

4b9b3361

Ответ 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