Jenseits von Python#

Dies ist eine kleine Sammlung von Gedanken zur Einbeziehung von Code, der in anderen Sprachen als Python geschrieben ist. Derzeit ist die einzige Option für andere Sprachen als Python, für die wir zusätzliche Dokumentation haben, Cython.

Kann ich eine andere Programmiersprache als Python verwenden, um meinen Code zu beschleunigen?

Ja. Die in SciPy verwendeten Sprachen sind Python, Cython, Pythran, C, C++ und Fortran. All diese haben ihre Vor- und Nachteile. Wenn Python wirklich nicht genug Leistung bietet, kann eine dieser Sprachen verwendet werden. Wichtige Überlegungen bei der Verwendung kompilierter Sprachen sind Wartbarkeit und Portabilität. Für die Wartbarkeit werden Pythran und Cython gegenüber C/C++/Fortran bevorzugt. Cython, C und C++ sind portabler als Fortran. Ein Großteil des vorhandenen Fortran-Codes in SciPy ist älterer, kampferprobter Code, der nur in Python/SciPy eingebunden wurde (aber nicht speziell dafür geschrieben wurde).

Unser grundlegender Rat ist: Verwenden Sie Pythran oder Cython, um kleinere Codeabschnitte zu beschleunigen. In Fällen, in denen Pythran oder Cython nicht mehr ausreichen, bevorzugen Sie C oder C++. Wenn es spezifische Gründe gibt, warum Fortran bevorzugt wird, besprechen Sie diese Gründe bitte zuerst.

Kann ich Numba verwenden?

Noch nicht, aber wir erwägen es für die Zukunft. Es ist möglich, Code zu schreiben, der benutzerdefinierte Funktionen entgegennimmt, die von Numba generiert werden. Siehe Erweiterung von scipy.ndimage in C.

Wie debugge ich Code, der in C/C++/Fortran innerhalb von SciPy geschrieben ist?

Der einfachste Weg, dies zu tun, ist, zuerst ein Python-Skript zu schreiben, das den C-Code aufruft, dessen Ausführung Sie debuggen möchten. Zum Beispiel mytest.py

from scipy.special import hyp2f1
print(hyp2f1(5.0, 1.0, -1.8, 0.95))

SciPy im Debug-Modus bauen

python dev.py build -d

Jetzt können Sie

gdb --args python dev.py python mytest.py

Wenn Sie vorher nicht mit aktivierten Debug-Symbolen kompiliert haben, entfernen Sie zuerst das Verzeichnis build. Während des Debuggens

(gdb) break cephes_hyp2f1
(gdb) run

Die Ausführung stoppt nun bei der entsprechenden C-Funktion und Sie können wie gewohnt durch sie hindurchschreiten. Anstelle von einfachem gdb können Sie natürlich Ihren bevorzugten alternativen Debugger verwenden; führen Sie ihn auf der Binärdatei python mit den Argumenten python dev.py python mytest.py aus.