Próbuję wykonać obliczenia w języku Cython, które opierają się w dużej mierze na niektórych numpy/scipy funkcji matematycznych, takich jak numpy.log
. Zauważyłem, że jeśli zadzwonię wielokrotnie NumPy/funkcje scipy w pętli w Cython istnieją ogromne koszty ogólne, np:Jak wywoływać funkcje numpy/scipy C bezpośrednio w Cython, bez obciążania wywołaniami Pythona?
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)
To jest bardzo drogie, przypuszczalnie dlatego np.log
przechodzi Pythonie zamiast wywoływania funkcji numpy C bezpośrednio. Jeśli zamieniam tę linię na:
from libc.math cimport log
...
# calling libc function 'log'
value = log(2)
to znacznie szybciej. Jednak, gdy próbuję przekazać tablicę numpy do libc.math.log:
cdef np.ndarray[long, ndim=1] foo = np.array([1, 2, 3])
log(foo)
daje ten błąd:
TypeError: only length-1 arrays can be converted to Python scalars
Moje pytania to:
- Czy jest możliwe wywołać funkcję C i przekazać jej tablicę numpy? Czy może on być użyty tylko na wartościach skalarnych, które wymagałyby napisania pętli (np. Gdybym chciał zastosować ją do tablicy
foo
powyżej). - Czy istnieje analogiczny sposób wywoływania funkcji scipy z C bezpośrednio bez Python narzut? Jak mogę zaimportować bibliotekę funkcji C scipy?
przykład betonu: że chcesz wywołać wiele scipy-tych lub przydatnych funkcji statystycznych NumPy'S (np scipy.stats.*
) na wartościach skalarnych wewnątrz for
pętli w Cython? Szalenie polega na ponownym zaimplementowaniu wszystkich tych funkcji w języku Cython, więc ich wersje C muszą zostać wywołane. Na przykład, wszystkie funkcje związane z pdf/cdf i próbkowaniem z różnych rozkładów statystycznych (np. Zobacz http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.pdf.html#scipy.stats.rv_continuous.pdf i http://www.johndcook.com/distributions_scipy.html) Jeśli wywołasz te funkcje z narzutem Pythona w pętli, będzie to zdecydowanie spowolnione.
dzięki.
Plik 'scipy.stats' pdf itp.funkcje są głównie wdrażane w Pythonie. Możesz uniknąć narzutu, przetwarzając wiele liczb naraz. –