2013-02-08 20 views
13

Chcę wiedzieć, jak przekonwertować normalną listę Pythona do listy C z Cython, przetworzyć go i zwrócić listę Pythona. Jak:Python list do Cython

Python skrypt:

import mymodule 

a = [1,2,3,4,5,6] 
len = len(a) 
print(mymodule.process(a,len)) 

Cython skrypt (mymodule.pyd):

cpdef process(a, int len): 
    cdef float y 
    for i in range(len): 
     y = a[i] 
     a[i] = y * 2 
    return a 

Czytałem o MemoryView i wiele innych rzeczy, ale ja naprawdę nie unterstand co się stało i dużo Przykład użycia Numpy (nie chcę go używać, aby uniknąć użytkownika mojego skryptu pobrać duży pakiet ... w każdym razie myślę, że to nie działa z moim oprogramowaniem). Potrzebuję naprawdę prostego przykładu, aby zrozumieć, co dokładnie się dzieje.

+0

Dlaczego nie zadeklarowałeś typu "a"? –

+0

@ IgnacioVazquez-Abrams To jest mój problem. to jest tablica pythonów ... Nie wiem, jak zadeklarować ją jako tablicę Cythona lub jak ją przekonwertować. To prosty przykład, a nie mój ostateczny scenariusz. Chcę zrozumieć, jak to zrobić, nie ludzie konwertują mój skrypt dla mnie :) –

+0

To nie jest tablica, to lista. –

Odpowiedz

21

Należy bezpośrednio skopiować zawartość listy do tablicy. Na przykład ...

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 
+0

i konwertujesz z powrotem do Pythona wykonując inną pętlę z odwrotnością jak [i] = my_ints [i]? Jeśli dobrze rozumiem.I napisz moją pętlę z" y = my_ints [ i] my_ints [i] = y * 2 "gdzie wstawiłeś" ... "? Przepraszam za to pytanie, jestem naprawdę nowy w cytoninie i nie jestem zaawansowany w programowaniu, ale zmotywowany do nauki :) –

+1

dobrze działa dobrze . Nie dobry wzrost wydajności (8x) prawdopodobnie prawdopodobnie dlatego, że potrzeba dużo czasu na konwersję tylko po to, aby wykonać prostą operację, taką jak pomnożenie przez 2. Czy możesz mi wyjaśnić, co dokładnie robi lęg z malloc? I po co używać nogil? Zwiększenie wydajności? –

+1

malloc() to standardowa funkcja biblioteki C służąca do dynamicznego przydzielania pamięci na stercie. Zacznij tutaj: http://en.wikipedia.org/wiki/Malloc –