Ich werde versuchen, Ihre Frage zu beantworten, da Sie speziell nach Python fragen. Ich werde meine eigene Methode zur Lösung eines Simulationsproblems beschreiben. Strategien für schnellere Simulationen werden in dieser Beschreibung angegeben.
Zuerst habe ich neue Simulationen in Python erstellt. Natürlich versuche ich, NumPy und SciPy so weit wie möglich zu nutzen. Während NumPy einen geeigneten Array-Datentyp für numerische Simulationen bietet, bietet SciPy umfangreiche numerische Routinen, die mit NumPy-Arrays arbeiten.
Sobald die Prototypen mehr oder weniger funktionieren, versuche ich herauszufinden, welche Teile des Programms oder Skripts den Engpass darstellen. Dafür gibt es typische Kandidaten:
- Loops in Python sind langsam. Sehr langsam.
- Da Python die Eingabe von Enten verwendet , kann der Aufruf von Funktionen langsam sein.
Ich benutze eine einfache Profilierungsstrategie, um zu erfahren, wo die gesamte Laufzeit verbracht wird. Mit der IPython- Shell (die ich nicht genug empfehlen kann) starte ich mein Skript mit
%timeit script.py
Dieser "magische Befehl" führt die Profilerstellung (unter Verwendung von timeit ) für Sie durch und zeigt Ihnen eine Liste mit Zeiten an, zu denen Ihr Skript beendet wurde. Verwenden Sie diese Liste, um herauszufinden, wo Ihr Code zu langsam ist.
Sobald Sie die Teile festgelegt haben, die beschleunigt werden müssen, können Sie die Verwendung kompilierter Sprachen in Betracht ziehen. Ich werde auf zwei Lösungen hinweisen.
Zunächst gibt es die Cython- Sprache. Cython ist eine Programmiersprache, die Python sehr ähnlich ist (tatsächlich ist Python-Code oft auch gültiger Python-Code). Der Cython-Compiler konvertiert die Cython-Dateien jedoch in C-Code, der dann in ein von Python verwendbares Modul kompiliert werden kann. Cython versteht NumPy-Arrays. Cython kann Ihnen auf zwei Arten helfen: Erstens können Sie Datentypen einführen. Dadurch werden Funktionsaufrufe beschleunigt. Wenn Sie über Arrays iterieren, wird Ihre Schleife schneller ausgeführt (wenn Sie sowohl die Dummy-Variable als auch das Array eingeben, erhalten Sie eine einfache C-Schleife!). Zweitens laufen in meinen Experimenten sogar die untypisierten Skripte etwas schneller, da sie kompiliert und nicht interpretiert werden.
Die andere kompilierte Sprache, die für Sie nützlich sein wird, ist Fortran. Es gibt verschiedene Möglichkeiten, Fortran mit Python zu verwenden ( f2py , fortwrap , Cython ). Da f2py für mich persönlich der einfachste Weg zu sein scheint, beschreibe ich kurz, was es tut. f2py kann Fortran-Code für Python-Module kompilieren. Damit können Sie NumPy-Arrays als Eingabe- und Ausgabevariablen aus dem Python-Raum verwenden. Im Fortran-Raum sind dies gewöhnliche Fortran-Arrays. Sie können diese mit voller Fortran-Geschwindigkeit bedienen.
Ich persönlich benutze Cython eher dort, wo die Anzahl der Funktionsaufrufe der Engpass ist. Für schleifenlastige Sachen bevorzuge ich f2py (vielleicht weil ich einen starken Fortran-Hintergrund habe).
Ein weiterer Hinweis zu Fortran: Das moderne Fortran liest und schreibt sehr ähnlich wie NumPy - die Syntax ist sehr eng. Dies macht es einfach, NumPy-Code in Fortran-Code zu konvertieren.
Beachten Sie, dass sowohl Cython als auch f2py in gewisser Weise Paralleismus unterstützen. Für Cython, finden Sie Hilfe finden hier , während für Fortran, da die Standardtechniken wie sind OpenMP oder MPI. Darüber hinaus gibt es auch P ython-Wrapper für MPI . Ich persönlich benutze mpi4py auf Python-Ebene sowie OpenMP in Fortran.
Lassen Sie mich ein bisschen Literatur empfehlen: das Buch Python Scripting For Computational Science von H.-P. Langtangen ist eine großartige Ressource für Python im Allgemeinen sowie für Strategien, um Python ein bisschen schneller zu machen. Leider erwähnt AFAIR nichts über Cython. Als zweite Ressource können Sie sich diese Folien ansehen . Diese geben Beispiele für alles, was ich in diesem Beitrag erwähnt habe (siehe auch den Code und die Quellen hier ). Es gibt viele andere gute Folien im Internet.
Wenn Sie spezielle Fragen haben, helfen wir Ihnen gerne weiter!