Python vs. Matlab il banchmark
28 settembre 2012 8 commenti
Dopo aver constato che python offre un ottima alternativa a matlab almeno dal punto di vista delle funzionalità, ora bisogna vedere chi è il più veloce.
Quindi ho messo in piedi un piccolo test per vedere chi fa meglio. Sul campo ci sono python con le librerie numpy compilate con le MKL e matlab 2012a il tutto su ArchLinux a 64bit e CPU Core i7 a 3.4 Ghz.
Il test si divide in 10 parti ed è costituito per la maggior parte di operazioni di algebra lineare più alcune operazioni importanti.
La lista dei test
- EIG: Eigenvalues
- SVD: Single value decomposition.
- INV: Matrice inversa
- DET: determinante
- DOT: Prodotto scalare
- FFT: Trasformata veloce di fourier su un vettore
- CONV: Convoluzione fra due vettori
- MatMult: Moltiplicazione di matrici
- Sin: Eseguire l’operazione sin su una matrice.
- rand: generare una matrice di numeri random
Qui i sorgenti dei test; disponibili su gitorius
https://gitorious.org/python-vs-matlab/python-vs-matlab
I risultati
ogni test è stato eseguito 5 volte di fila e il tempo riportato è quello medio. Il test è stato fatto con python-numpy basato su MKL che sul numpy inserito nei repository ufficiali di Archlinux ovvero basato su LAPACK, e quello basato su ATLAS disponibile su AUR per matlab ho pure provato ad attivare la funzione GPU, per vedere la differenza.
Le dimensioni rappresentano la dimensione delle matrici, e nel caso della FFT e della convoluzione dei vettori usati (nb. per la conv. sono necessari due vettori). Il tempo è misurato in secondi.
Dimensione | python MKL | Matlab | python Lapack | python ATLAS | Matlab GPU | |
EIG | 2000 x 2000 | 7.52 | 3.44 | 40.8 | 31.34 | 2.61 |
SVD | 2000 x 2000 | 6.85 | 5.53 | 55.3 | 13.44 | 6.2 |
INV | 4000 x 4000 | 2.25 | 1.74 | 54.3 | 3.6 | 1.96 |
DET | 5000 x 5000 | 1.07 | 1.02 | 26.73 | 2.00 | 0.97 |
DOT | 4000 x 4000 | 1.37 | 1.33 | 155.53 | 157.6 | 1.26 |
CONV | 2*10^6&10000 | 3.15 | 1.25 | 16.32 | 16.20 | 0.23 |
FFT¹ | 1 *10^7 | 0.26 | 0.13 | 0.26 | 0.26 | 0.034 |
MatMult | 5000 x 5000 | 2.56 | 2.58 | 302.83 | 299.17 | 2.42 |
Sin | 4000 x 4000 | 1.98 | 0.042 | 1.99 | 2.71 | 0.00028 |
Rand | 10000×10000 | 1.09 | 0.92 | 1.09 | 1.09 | – |
Nota: np MKL, python LAPACK e python ATLAS sono tutti test fatti con numpy
¹La FFT è stata eseguita con le scipy.fftpack.fft che si è rilevata la funzione più performante rispetto alla fft presente in numpy.
Ed infine i grafici dei tempi e delle velocità con numpy–MKL; matlab e matlab–GPU, dove si vede chiaramente che matlab da risultati migliori.
Il primo grafico riporta i tempi di matlab e numpy-MKL, escludendo il test sin. Con matlab che in genere è il più veloce
Il secondo Grafico è quello delle velocità poste su scala logaritmica dove ci sono numpy-MKL, matlab e matlab-GPU con tutti i test, in questo caso si vede chiaramente il problema del test sin e l’accelerazione che possono garantire le GPU.
Conclusione
Quello che si può dire è che la copia numpy e MKL va bene, ma non è ancora al livello di matlab, e purtroppo devo notare il mancato collegamento della FFT a MKL e il disastroso risultato della operazione più banale, ovvero eseguire il seno su tutti gli elementi di una matrice. Comunque in molti test la velocità fra numpy e matlab è ormai equivalente.
Per quanto riguarda lapack, il risultato è veramente disastroso, mentre per ATLAS è contrastante, ma di sicuro molto inferiore a quello di MKL.
Infine matlab con GPU da risultati ottimi con la FFT e la convoluzione e col resto è circa uguale, ma non sempre migliore, questo mostra che le GPU nel momento in cui lavorano in condizioni ottimali sono imbattibili ma col limite della memoria, che mi ha impedito di fare alcuni test con matrici troppo grandi, ed in alcuni casi diventa poco efficiente.
In conclusione python è sempre meglio, ma ha bisogno di essere ancora sviluppato e offre a tutti gli effetti un ottima alternativa a matlab.
Ps:
Nel fare i test ho preso in parte ispirazione da questo articolo
Per gli utenti ArchLinux, ho messo su AUR i PKGBUILD delle numpy e scipy basate su MKL.
https://aur.archlinux.org/packages.php?ID=62281
https://aur.archlinux.org/packages.php?ID=62572