Sto tentando di eseguire calcoli in Cython che si basano in gran parte su alcune funzioni matematiche numpy/scipy come numpy.log
. Ho notato che se chiamo NumPy funzioni/SciPy ripetutamente in un ciclo in Cython, ci sono enormi costi fissi, ad esempio:Come chiamare direttamente le funzioni C di numpy/scipy da Cython, senza sovraccarico di chiamata Python?
import numpy as np
cimport numpy as np
np.import_array()
cimport cython
def myloop(int num_elts):
cdef double value = 0
for n in xrange(num_elts):
# call numpy function
value = np.log(2)
Questo è molto costoso, presumibilmente perché np.log
attraversa Python piuttosto che chiamare la funzione numpy C direttamente. Se sostituisco la riga con:
from libc.math cimport log
...
# calling libc function 'log'
value = log(2)
quindi è molto più veloce. Tuttavia, quando si tenta di passare un array di NumPy a libc.math.log:
cdef np.ndarray[long, ndim=1] foo = np.array([1, 2, 3])
log(foo)
dà questo errore:
TypeError: only length-1 arrays can be converted to Python scalars
Le mie domande sono:
- E 'possibile chiama la funzione C e passa una matrice numpy? Oppure può essere usato solo su valori scalari, il che richiederebbe di scrivere un ciclo (ad esempio se volessi applicarlo all'array
foo
sopra.) - C'è un modo analogo di chiamare le funzioni scipy da C direttamente senza Python in testa? Come posso importare la libreria delle funzioni C di Scipy?
Esempio concreto: dire che si desidera chiamare molti dei SciPy di o statistiche utili funzioni di NumPy (ad esempio scipy.stats.*
) su valori scalari all'interno di un ciclo for
in Cython? È assurdo dover reimplementare tutte quelle funzioni in Cython, quindi è necessario chiamare le loro versioni C. Ad esempio, tutte le funzioni relative a pdf/cdf e campionamento da varie distribuzioni statistiche (ad esempio, vedere http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.pdf.html#scipy.stats.rv_continuous.pdf e http://www.johndcook.com/distributions_scipy.html) Se si richiamano queste funzioni con l'overhead di Python in un ciclo, sarà proibitivamente lento.
grazie.
Il pdf 'scipy.stats' ecc.le funzioni sono principalmente implementate in Python. Puoi evitare l'overhead elaborando molti numeri contemporaneamente. –