[PYTHON] Beschleunigung der numerischen Berechnung mit NumPy / SciPy: Aufnehmen gefallener Ohren

Ziel

Es ist für Anfänger von Python und NumPy geschrieben. Es kann besonders nützlich sein für diejenigen, die eine numerische Berechnung physikalischer Systeme anstreben, die "Ich kann C-Sprache verwenden, habe aber kürzlich Python gestartet" oder "Ich verstehe nicht, wie man wie Python schreibt" entspricht. Vielleicht.

Außerdem kann es aufgrund meines mangelnden Studiums zu falschen Beschreibungen kommen. Bitte verzeihen Sie mir.

Zusammenfassung

Beschleunigung der numerischen Berechnung mit NumPy: Basics Beschleunigung der numerischen Berechnung mit NumPy / SciPy: Anwendung 1 Beschleunigung der numerischen Berechnung mit NumPy / SciPy: Anwendung 2

Es ist ein Bonus. Es geht hauptsächlich um kleine Geschichten.

numpy und mathematische Funktionen

  1. Die universelle Funktion von "numpy" nimmt "ndarray" als Argument und gibt "ndarray" zurück. Die "math" -Funktion kann nur "int" oder "float" annehmen.

  2. Die math Funktion kann nicht complex annehmen. Wenn Sie complex übergeben möchten, verwenden Sie cmath. Numpy kann auch complex annehmen.

  3. Die Funktion "numpy" gibt eine RuntimeWarning zurück, wenn sie nicht definiert ist oder einen schrecklichen Wert angibt, aber keine Ausnahme zurückgibt. Die Funktion "math" gibt eine Ausnahme zurück:

import numpy as np
import math as m

m.log(0) # ValueError: math domain error
mp.log(0) # RuntimeWarning: divide by zero encountered in log
>>> -inf

mp.log(-1) # RuntimeWarning: invalid value encountered in log
>>> nan

Ich bin froh, dass np.log (0 ) -inf` zurückgibt.

Wie Sie sehen können, ist die universelle Funktion von "numpy" vielseitig, aber es scheint, dass "math" eine höhere Ausführungsgeschwindigkeit aufweist. Wenn Sie "ndarray" nicht übergeben möchten, sollten Sie die "math" -Funktion verwenden.

Zugriff auf "ndarray" per Liste

Wie ich bereits erwähnt habe, können Sie in einer Liste auf das "ndarray" zugreifen:

a = [1, 3, 5]
b = [7, 5, 4, 6, 2, 3, 1, 9, 8]
b[a] # TypeError: list indices must be integers or slices, not list

b_np = np.array(b)
b_np[a]
>>> array([5, 6, 3])

Es wird einige Situationen geben, die nützlich sind, um sie zu kennen.

Um BLAS besser zu machen

Da die grundlegende Matrixoperation von "numpy" von BLAS (Basic Linear Algebra Subprograms) abhängt, variiert die Geschwindigkeit stark in Abhängigkeit von dem verwendeten BLAS. Beispielsweise ist "Referenz-BLAS", das standardmäßig im Ubuntu-System enthalten ist, recht gut. Es ist eine langsame Implementierung, und Sie müssen das entsprechende BLAS verwenden, um numpy selbst schneller zu machen.

"Open BLAS [^ 1]" ist einer der ersten Kandidaten. Informationen zur Einführungsmethode und zum Effekt finden Sie unter hier. Ich war dir zu Dank verpflichtet.

Tatsächlich ist MLK (Math Kernel Library) [^ 3] jedoch standardmäßig in Anaconda [^ 2] installiert und sehr schnell, solange Sie Numpy verwenden. Wer NumPy / SciPy verwendet, sollte Anaconda verwenden. Es scheint keinen Grund mehr zu geben, es nicht mehr zu benutzen.

Wenn Sie jedoch Anaconda installieren, wird der Python des Systems mit der entsprechenden Version von Anaconda überschrieben, was zu Problemen im System führen kann. Daher ist es besser, ihn über Pyenv usw. zu installieren. Informationen zum Erstellen einer Python-Umgebung mit Anaconda Hier wird detailliert beschrieben.

Impressionen über eine Teilmenge der Python-Beschleunigung

Es gibt eine Reihe von Frameworks zur Beschleunigung von Python, und ich habe versucht, einige davon zu verwenden.

Cython

Ist es eine neue Sprache, um die Verwendung der C-Erweiterungen von Python zu vereinfachen? Die grundlegende Syntax lautet Python, aber der Code wird zur Laufzeit in C kompiliert. Geben Sie Variablen ein, um die Dinge richtig zu beschleunigen. Sie müssen mir die Größe der Liste mitteilen, und wenn Sie sie richtig schreiben, ist die Ausführungsgeschwindigkeit wirklich C.

Wenn der Engpass des Codes offensichtlich ist, ist es besser, diesen Teil zu einer Funktion zu machen und ihn mit Cython neu zu schreiben? Die Variable hat jedoch einen Typ und die Listengröße ist fest, sodass es sich nicht mehr um Python handelt. Während des Schreibens habe ich mehrmals gedacht: "Wenn Sie dies schreiben möchten, schreiben Sie es von Anfang an in C ...". Ich glaube nicht, dass es Pythonic-Code sein wird.

Boost/Python

Boost-Bibliothek, mit der Sie C ++ - Klassen und -Funktionen so wie sie sind aus Python importieren können. Cython kann in Python geschrieben werden, einschließlich des Teils, den Sie beschleunigen möchten. Die Erstellung ist jedoch mühsam. Boost / Python ist C / C ++ nur für den Teil, den Sie beschleunigen möchten. Sie können es uns überlassen.

Gelenke mit mehreren Sprachen haben jedoch immer noch ein schmerzhaftes Typproblem. Es scheint, dass Sie "ndarray" auf der C ++ - Seite nicht übergeben können. Es gibt Frameworks wie Boost / NumPy und PyUblas, die "ndarray" übergeben können, aber mit Python3 erstellen Wird nicht wahr.

Numba

Ein Modul, das mit dem JIT-Compiler schneller wird. Es funktioniert mit einem einzigen Dekorator, und das Modul überspannt nicht mehr als zwei wie die beiden oben genannten. Obwohl ich die Zukunft sehr spüre, habe ich das Gefühl, dass das Know-how nicht reif ist. Manchmal wird es schneller, manchmal scheitert es ...

Fazit

Es stellte sich heraus, dass NumPy und SciPy für wissenschaftliche Berechnungen ausreichen.

abschließend

Ich kann es jedes Mal hinzufügen, wenn mir etwas einfällt. Vielen Dank.

[^ 1]: Dies ist eine Gabelung von "Go to BLAS", die von einem bestimmten Mr. Goto erstellt wurde. Mr. Goto scheint derzeit MKL zu entwickeln, und die Entwicklung von Goto BLAS hat aufgehört. Es scheint zu geben.

[^ 2]: Dies ist ein schönes Paket von Wissenschafts- und Technologiemodulen.

[^ 3]: Eine Bibliothek verschiedener von Intel entwickelter mathematischer Routinen. Enthält sehr schnelle Implementierungen wie BLAS, LAPACK.

Recommended Posts

Beschleunigung der numerischen Berechnung mit NumPy / SciPy: Aufnehmen gefallener Ohren
Beschleunigung der numerischen Berechnung mit NumPy / SciPy: Anwendung 2
Beschleunigung der numerischen Berechnung mit NumPy / SciPy: Anwendung 1
Beschleunigung numerischer Berechnungen mit NumPy: Basics
Sehen Sie, wie schnell Sie mit NumPy / SciPy beschleunigen können
[Python] Beschleunigung der Verarbeitung mit Cache-Tools
[Wissenschaftlich-technische Berechnung mit Python] Lösen (verallgemeinerter) Eigenwertprobleme mit numpy / scipy mithilfe von Bibliotheken