2013-02-08 10 views
13

Voglio sapere come convertire la normale lista python in lista C con Cython, elaborarla e restituire una lista python. Come:Elenco Python su Cython

Script Python:

import mymodule 

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

Cython copione (mymodule.pyd):

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

ho letto su MemoryView e molte altre cose, ma io in realtà non Unterstand cosa succede e un sacco di esempio uso Numpy (non voglio usarlo per evitare che l'utente del mio script scarichi un grosso pacchetto ... comunque penso che non funzioni con il mio software). Ho bisogno di un esempio davvero semplice per capire cosa sta succedendo esattamente.

+0

Perché non hai dichiarato il tipo di 'a'? –

+0

@ IgnacioVazquez-Abrams Questo è il mio problema. è un array python ... Non so come dichiararlo come array Cython o come convertirlo. Questo è un semplice esempio, non proprio il mio copione finale. Voglio capire come, non le persone convertono il mio script per me :) –

+0

Non è un array, è un elenco. –

risposta

21

È necessario copiare il contenuto della lista in un array in modo esplicito. Ad esempio ...

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

e tu converti nuovamente in python facendo un altro ciclo con l'inverso come un [i] = my_ints [i]? Se capisco bene e scrivi il mio ciclo con" y = my_ints [ i] my_ints [i] = y * 2 "dove metti" ... "? Scusa per questa domanda, sono davvero nuovo con cython e non molto avanzato nella programmazione, ma motivato ad imparare :) –

+1

okay funziona bene . Non è un buon aumento delle prestazioni (8x) probabilmente probabilmente perché ci vuole un sacco di tempo per convertire solo per fare una semplice operazione come moltiplicarlo per 2. Puoi spiegarmi che cosa fa esattamente il lign con malloc? E perché usare nogil? Aumento delle prestazioni? –

+1

malloc() è una funzione di libreria standard C per allocare dinamicamente la memoria sull'heap. Inizia qui: http://en.wikipedia.org/wiki/Malloc –