Ich versuche, Berechnungen in Cython, die sich stark auf einige numpy/scipy mathematische Funktionen wie verlassen. Ich habe bemerkt, dass, wenn ich numpy/scipy Funktionen wiederholt in einer Schleife in Cython nennen, gibt es große Gemeinkosten, zum Beispiel:Wie nummy/scipy C-Funktionen direkt von Cython aufgerufen werden, ohne Python-Aufruf-Overhead?
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)
Dies ist sehr teuer, vermutlich weil np.log
durch Python geht, anstatt die numpy C-Funktion aufrufen direkt. Wenn ich diese Zeile mit ersetzen:
dann ist es viel schneller. Allerdings, wenn ich versuchen, eine numpy Array übergeben libc.math.log:
cdef np.ndarray[long, ndim=1] foo = np.array([1, 2, 3])
log(foo)
es diesen Fehler gibt:
TypeError: only length-1 arrays can be converted to Python scalars
Meine Fragen sind:
- Ist es möglich, Rufen Sie die C-Funktion auf und übergeben Sie ihr ein numpiges Array? Oder kann es nur für Skalarwerte verwendet werden, für die ich eine Schleife schreiben müsste (zB wenn ich es auf das obige Array anwenden möchte)
- Gibt es eine analoge Möglichkeit, scipy-Funktionen von C direkt ohne a aufzurufen Python-Aufwand? Wie kann ich scipys C-Funktionsbibliothek importieren?
Konkretes Beispiel: Angenommen, Sie viele scipy oder der numpy des nützlichen Statistikfunktionen (z scipy.stats.*
) auf skalare Werte innerhalb einer for
Schleife in Cython nennen wollen? Es ist verrückt, alle diese Funktionen in Cython neu zu implementieren, daher müssen ihre C-Versionen aufgerufen werden. Zum Beispiel alle Funktionen im Zusammenhang mit pdf/cdf und Sampling von verschiedenen statistischen Verteilungen (z. B. siehe http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.pdf.html#scipy.stats.rv_continuous.pdf und http://www.johndcook.com/distributions_scipy.html) Wenn Sie diese Funktionen mit Python Overhead in einer Schleife aufrufen, wird es prohibitiv langsam.
danke.
Die Datei 'scipy.stats' usw.Funktionen werden hauptsächlich in Python implementiert. Sie können Overhead vermeiden, indem Sie viele Zahlen gleichzeitig verarbeiten. –