Spezzerò la mia risposta in tre parti. Creazione di profili, accelerazione del codice Python tramite C e accelerazione di Python tramite Python. Ritengo che Python disponga di alcuni dei migliori strumenti per esaminare quali sono le prestazioni del codice, quindi eseguire il drill-down fino al reale collo di bottiglia. Accelerare il codice senza profilare è come cercare di uccidere un cervo con un uzi.
Se sei davvero interessato solo ai prodotti mat-vec, consiglierei scipy.sparse .
Strumenti Python per la profilazione
Moduli profilo e cProfile : questi moduli offrono l'analisi del tempo di esecuzione standard e lo stack di chiamate delle funzioni. È abbastanza bello salvare le loro statistiche e usando il modulo pstats puoi guardare i dati in vari modi.
kernprof : questo strumento mette insieme molte routine per fare cose come il tempismo del codice riga per riga
memory_profiler : questo strumento produce impronte di memoria riga per riga del codice.
Temporizzatori IPython : latimeit
funzione è abbastanza utile per vedere le differenze nelle funzioni in modo interattivo veloce.
Accelerare Python
Cython : cython è il modo più veloce per prendere alcune funzioni in Python e ottenere codice più veloce. Puoi decorare la funzione con la variante cython di Python e genera codice c. Questo è molto stabile e può anche collegarsi ad altro codice scritto a mano in c / c ++ / fortran abbastanza facilmente. È di gran lunga lo strumento preferito oggi.
ctypes : i ctypes ti permetteranno di scrivere le tue funzioni in c e poi di avvolgerle rapidamente con la sua semplice decorazione del codice. Gestisce tutto il dolore del casting da PyObjects e gestisce il gil per chiamare la funzione c.
Esistono altri approcci per scrivere il codice in C ma sono tutti in qualche modo più adatti per prendere una libreria C / C ++ e racchiuderla in Python.
Approcci solo per Python
Se vuoi rimanere principalmente in Python, il mio consiglio è di capire quali dati stai usando e scegliere i tipi di dati corretti per l'implementazione dei tuoi algoritmi. È stata la mia esperienza che di solito aumenterai molto di più ottimizzando le tue strutture di dati rispetto a qualsiasi hack di basso livello. Per esempio:
intorpidimento : un array contingente molto veloce per operazioni a passo di matrici
numexpr : un ottimizzatore di espressioni di matrice numpy. Permette il multithreading di espressioni numpy di array e si sbarazza anche dei numerosi temporanei che numpy crea a causa delle restrizioni dell'interprete Python.
blist : un'implementazione b-tree di un elenco, molto veloce per l'inserimento, l'indicizzazione e lo spostamento dei nodi interni di un elenco
panda : frame di dati (o tabelle) analisi molto veloci sugli array.
pytables : tabelle gerarchiche strutturate rapidamente (come hdf5), particolarmente utili per calcoli fuori core e query su dati di grandi dimensioni.