numba est un module qui exécute Python en utilisant le compilateur JIT (juste à temps), Cython est un langage de programmation qui peut être écrit comme Python mais pré-compilé comme C / C ++.
Voici le traitement sur le bloc-notes Jupyter.
Anaconda, python 3.7.3 est utilisé.
Dans le code qui génère le nième de la séquence de Fibonacci, comparons la vitesse avec python, numba, cython et cython typé.
def python_fib(n):
a, b = 0., 1.
for i in range(n):
a, b = a + b, a
return a
Mesurons le temps nécessaire pour calculer le 1000ème nombre dans la séquence de Fibonacci avec le module timeit
.
%timeit python_fib(1000)
10000 loops, best of 3: 33.6 µs per loop
Il semble que cela ait pris 33,6 microsecondes en moyenne.
Dans ce cas, la commande% timeit effectue le traitement suivant.
Le nombre de boucles (10000 boucles dans ce cas) est automatiquement ajusté par la fonction de «% timeit», et change en fonction de la vitesse d'exécution du code à mesurer.
numba peut être installé avec pip
.
pip install numba
Utiliser numba est très simple, il suffit d'ajouter un décorateur @ jit
.
from numba import jit
@jit
def numba_fib(n):
a, b = 0.0, 1.0
for i in range(n):
a, b = a + b, a
return a
Mesurez le temps de traitement.
%timeit numba_fib(1000)
The slowest run took 77684.24 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.26 µs per loop
1,26 microsecondes! C'est 26 fois plus rapide.
Dans jupyter, cython peut être chargé avec la commande magique suivante.
%load_ext Cython
La compilation et l'optimisation se font en mettant %% cython en premier.
%%cython
def cython_fib(n):
a, b = 0.0, 1.0
for i in range(n):
a, b = a + b, a
return a
%timeit cython_fib(1000)
100000 loops, best of 3: 8.22 µs per loop
8,22 microsecondes. C'est environ quatre fois plus rapide sans rien faire.
%%cython
def cython_fib2(int n):
a, b = 0., 1.
for i in range(n):
a, b = a + b, a
return a
%timeit cython_fib2(1000)
The slowest run took 7.27 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 984 ns per loop
0,984 microsecondes! 34 fois plus rapide.
S'il s'agit d'un processus simple comme celui ci-dessus, il est facile de le déplacer avec numba ou cython, mais s'il s'agit d'un processus compliqué, il y aura des cas où il ne peut pas être géré.
Si vous voulez de la vitesse, vous voudrez peut-être passer à une autre langue dès que possible, ou envisager une sélection multi-processus ou matériel.