Aggiornamento:
risultati notevolmente più efficienti si ottengono in questo modo:
evitare l'inclusione della libreria Numpy di Python, per scrivere np.pi e np.exp(), molto più efficiente definire i valori 3.141592653589793 e 2.718281828459045, con il numero di cifre decimali desiderato (anziché andare a richiamarli dalla libreria, ad ogni iterazione del ciclo!)
scrivere il codice Cython direttamente "ibrido" in Python, più scomodo da leggere e come sintassi, ma risulta più efficiente (meglio rispetto a richiamare diversi file Python; tuttavia, la compilazione di Cython seguendo anche gli altri accorgimenti, è ciò che genera il risultato migliore in assoluto!)
CASO 1: codice solo Python
import time
start=time.time()
ris=0
N=10**6
a=0
b=20
h=(b-a)/N
def f(x):
return 1/(2*3.141592653589793)**0.5*2.718281828459045**(-x**2/2)
for i in range(0,N):
ris+=h*f(a+i*h)
end=time.time()
print(end-start,"s")
CASO 2: codice Cython incluso in Python
import time
import cython
def f(N: cython.int):
ris=0
a: cython.int
a=0
b: cython.int
b=20
h=(b-a)/N
for i in range(N):
ris+=h/(2*3.141592653589793)**0.5*2.718281828459045**(-0.5*(a+i*h)**2)
return ris
start=time.time()
f(1000000)
end=time.time()
print(end-start,"s")
Risultati: il caso 1, solo file Python (scritto senza includere la libreria Numpy) ha un tempo di esecuzione di circa 0,48 secondi. il caso 2, codice Cython incluso all'interno del singolo file Python, ha un tempo di esecuzione di circa 0,31 secondi.
Ricordiamo che i precedenti banchmark hanno mostrato Python con Numpy 2,95 secondi (67 volte più lento rispetto a C ottimizzato) e Cython 2,2 secondi, circa 50 volte più lento rispetto a C.
In questo caso invece abbiamo Python senza Numpy 0,48 secondi ovvero 10,9 volte più lento rispetto a C (NB da 67 a 10, ottimo miglioramento!!) e Cython incluso in Python che genera un tempo di 0,31 secondi significa 7,04 volte più lento rispetto a C.
Questa accortezza permette quindi di ottenere risultati decisamente migliori!