Dopo aver parlato di Cython, vediamo un altro caso interessante: la libreria Numba che, secondo quanto dichiarato:
Numba: A High Performance Python Compiler
Numba makes Python code fast
Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code
Premessa: da analisi come il benchmark performance C, Python, MATLAB - GNU Octave, JavaScript, PHP è chiaro che il linguaggio C consente di ottenere un'efficienza notevolmente maggiore rispetto a linguaggi iterpretati come Python. Tuttavia, con alcuni accorgimenti, anche Python può ottenere dei miglioramenti.
Per uniformarsi al solito caso di studio e poter quindi fare un confronto (risoluzione numerica dell'integrale definito di una funzione gaussiana, con le stesse iterazioni N=106, tradotto nei vari linguaggi), vediamo due casi distinti, con il codice ottimizzato nel miglior modo (poi facciamo una precisazione a riguardo):
- codice Python "pulito"
- codice Python con la libreria Numba
Vediamo il codice nello specifico:
- caso 1: codice Python "pulito"
import time
def f():
N=10**6
ris=0
a=0
b=20
h=(b-a)/N
for i in range(N):
ris+=2.718281828459045**(-0.5*(a+i*h)**2)
ris*=h*1/(2*3.141592653589793)**0.5
return ris
start=time.time()
f()
end=time.time()
print(end-start,"s")
- caso 2: codice Python con la libreria Numba
import time
from numba import jit
@jit(nopython=True)
def f():
N=10**6
ris=0
a=0
b=20
h=(b-a)/N
for i in range(N):
ris+=2.718281828459045**(-0.5*(a+i*h)**2)
ris*=h*1/(2*3.141592653589793)**0.5
return ris
start=time.time()
f()
end=time.time()
print(end-start,"s")
Risultati:
- codice Python "pulito": tempo esecuzione in media 0,25 secondi
- codice Python con la libreria Numba: tempo esecuzione in media 0,38 secondi
Quindi la libreria Numba, almeno per questo caso, NON ha migliorato le performance! Probabilmente casi diversi o modalità diverse (es. nel caso di Cython, compilando il codice).
La precedente precisazione da fare è che il codice è stato scritto facendo uso di una funzione f() che poi viene richiamata e non direttamente senza funzione, questo per uniformità fra i due casi (altrimenti avrebbe poco senso il confronto), dato che Numba richiede che l'algoritmo sia scritto dentro una funzione.