Ho appena testato la libreria Scipy di Python, l'attuale versione 1.9.3 (sito ufficiale: scipy.org), installabile facilmente da riga di comando tramite pip:
pip install scipy
Lo scopo di questa libreria è fornire funzioni e algoritmi per quanto riguarda la matematica, ingegneria. Rispetto alla più classica Numpy, con Scipy abbiamo un miglioramento di alcune funzionalità di Numpy (alcune di esse vengono richiamate), con algoritmi più dettagliati e generalizzati (validità estesa per molte situazioni di matematica, fisica, ingegneria), in ogni caso il codice è scritto in modo più efficiente rispetto a Python tradizionale (come poi vedremo dai risultati). Questo senza ricorrere a soluzioni "particolari" come Cython (si consiglia eventualmente di lavorare in C/C++, se necessario un tale valore di efficienza computazionale; approfondimento dettagliato: Benchmark performance C, Python, MATLAB - GNU Octave, JavaScript, PHP).
Caso di studio:
Ho fatto questo test di performance: confronto fra il tempo di esecuzione di un codice Python3 standard e uno equivalente tramite una funzione della libreria Scipy. In particolare si tratta di una curva gaussiana (media zero, deviazione standard 1), risoluzione numerica tramite metodo trapezoidale. Vediamo di seguito il codice:
import scipy as sc
import numpy as np
import time
def f(x):
return 1/(2*3.141592653589793)**0.5*2.718281828459045**(-0.5*x**2)
N=100000
start=time.time()
ris=sc.integrate.trapezoid(f(np.arange(0,20,1.0/N)),dx=1.0/N)
temp=time.time()
ris2=0
i=0
b=20
while i<=b:
ris2+=1.0/N*(f(i)+f(i+1.0/N))*0.5
i+=1.0/N
end=time.time()
print(temp-start,"s")
print(2*ris)
print(2*ris2)
print(end-temp,"s")
Per praticità, vista la simmetria è stata risolta la semi-gaussiana e poi moltiplicato il risultato per due. I risultati, dopo una media di alcune prove, sono:
- codice Python3 "classico": 1.95 secondi
- Scipy, funzione integrate.trapezoid(): 0.25 secondi
Conclusione: la libreria Scipy, in questo caso si è dimostrata a parità di condizioni, 8 volte più veloce rispetto al codice standard di Python 3.
Come già detto, Python non può pretendere di avere l'efficienza di C/C++ o FORTRAN o in genere linguaggi compilati; tuttavia con alcuni accorgimenti come questo, si può lavorare anche in ambito scientifico, dove sono richiesti sforzi computazionali di un certo tipo (approssimazioni numeriche, quindi un numero molto elevato di operazioni), con valori di efficienza più che buoni.