J'ai utilisé Numba dans mes recherches pour accélérer les programmes Python. Je suis tombé sur diverses erreurs lors de la mise en œuvre, je vais donc partager les résultats sous forme d'échantillon.
Dans mon cas, le calcul de la méthode d'optimisation du groupe de particules utilisant la méthode Lungekutter est devenu 33 fois plus rapide, passant d'environ 2000 secondes à environ 60 secondes.
※Mise en garde※
njit```.
--Numba peut fonctionner sans spécifier le type d'argument ou la valeur de retour, mais ici on suppose que tous sont spécifiés.$ 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 peut être installé avec la commande suivante.
$ pip install numba
np.empty``` dans la fonctionLors de l'utilisation de numba, l'utilisation de `` np.empty '' dans une fonction peut entraîner une erreur. Dans ce cas, la spécification du type comme suit a bien fonctionné.
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())
Pour renvoyer plusieurs valeurs de retour, écrivez sous la forme `` Tuple ((i8, i8)) ''. Notez que les parenthèses sont doublées.
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))
Lorsque vous traitez avec des listes multidimensionnelles dans Numba, écrivez comme `f8 [:,:]`
`.
Puisqu'il est bidimensionnel, cela ne signifie pas qu'il y a deux deux points, mais il semble que deux points soient suffisants pour n'importe quel nombre de dimensions.
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))
Il existe différentes façons d'accélérer Python, telles que Cython et Julia, mais je pense que la méthode Numba, qui écrit uniquement des décorateurs, est la plus simple.
Bien qu'il existe des restrictions telles que l'impossibilité d'utiliser des classes et des générateurs, j'ai pensé qu'il serait relativement facile à mettre en œuvre si la méthode devait accélérer le goulot d'étranglement localement.
Recommended Posts