Ich habe Numba in meiner Forschung verwendet, um Python-Programme zu beschleunigen. Ich bin bei der Implementierung auf verschiedene Fehler gestoßen, daher werde ich die Ergebnisse als Beispiel weitergeben.
In meinem Fall ist die Berechnung der Partikelgruppenoptimierungsmethode mit der Lungekutter-Methode 33-mal schneller geworden, von ungefähr 2000 Sekunden auf ungefähr 60 Sekunden.
※Hinweis※
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.2
BuildVersion: 19C57
$ python -V
Python 3.8.5
$ pip freeze
numba==0.51.0
numpy==1.19.1
Numba kann mit dem folgenden Befehl installiert werden.
$ pip install numba
Bei Verwendung von numba kann die Verwendung von `` `np.empty``` in einer Funktion zu einem Fehler führen. In diesem Fall funktionierte die Angabe des Typs wie folgt einwandfrei.
main.py
import numpy as np
from numba import njit
@njit("f8[:,:]()")
def func():
x = np.empty((1, 2), dtype=np.float64)
return x
print(func())
Um mehrere Rückgabewerte zurückzugeben, schreiben Sie als `Tuple ((i8, i8))`
.
Beachten Sie, dass die Klammern verdoppelt werden.
main.py
import numpy as np
from numba import njit
@njit("Tuple((i8, i8))(i8, i8)")
def func(x, y):
return x, y
print(func(1, 2))
Wenn Sie mit mehrdimensionalen Listen in Numba arbeiten, schreiben Sie als `f8 [:,:]`
.
Da es zweidimensional ist, bedeutet dies nicht, dass es zwei Doppelpunkte gibt, aber es scheint, dass zwei Doppelpunkte für eine beliebige Anzahl von Dimensionen ausreichen.
main.py
import numpy as np
from numba import njit
@njit("f8[:,:](f8[:,:])")
def func(x):
return x ** 2
x = np.random.rand(5, 5)
print(func(x))
Es gibt verschiedene Möglichkeiten, Python zu beschleunigen, wie Cython und Julia, aber ich denke, die Numba-Methode, die nur Dekorateure schreibt, ist die einfachste.
Obwohl es Einschränkungen gibt, wie beispielsweise die Nichtverwendung von Klassen und Generatoren, war es meiner Meinung nach relativ einfach zu implementieren, wenn die Methode den Engpass lokal beschleunigen würde.
Recommended Posts