Cercherò di rispondere alla tua domanda considerando che stai chiedendo specificamente Python. Descriverò il mio metodo per affrontare un problema di simulazione. Strategie per simulazioni più veloci sono riportate in questa descrizione.
Innanzitutto, prototipo di nuove simulazioni in Python. Certo, cerco di usare NumPy e SciPy il più possibile. Mentre NumPy fornisce un tipo di dati array adatto per simulazioni numeriche, SciPy offre una vasta gamma numerica che funziona con gli array NumPy.
Una volta che i prototipi funzionano più o meno, provo ad imparare quali parti del programma o script sono il collo di bottiglia. Ci sono candidati tipici per questo:
- I loop in Python sono lenti. Molto lento.
- Poiché Python utilizza la tipizzazione duck , le funzioni di chiamata possono essere lente.
Uso una semplice strategia di profilazione per sapere dove viene impiegato tutto il tempo di esecuzione. Usando la shell IPython (che non posso raccomandare abbastanza), eseguo il mio script
%timeit script.py
Questo "comando magico" farà la profilazione (usando timeit ) per te e ti presenterà un elenco con i tempi una volta terminato lo script. Usa questo elenco per scoprire dove il tuo codice è troppo lento.
Dopo aver inchiodato le parti che devono essere accelerate, è possibile prendere in considerazione l'uso di linguaggi compilati. Indicherò due soluzioni.
Innanzitutto c'è il linguaggio Cython . Cython è un linguaggio di programmazione molto simile a Python (in effetti, il codice Python è spesso anche un codice Python valido); tuttavia, il compilatore Cython converte i file Cython in codice C, che può quindi essere compilato in un modulo utilizzabile da Python. Cython comprende gli array NumPy. Esistono due modi in cui l'utilizzo di Cython può aiutarti: in primo luogo, è possibile introdurre tipi di dati. Ciò accelererà le chiamate di funzione. Inoltre, se si esegue l'iterazione su array, il ciclo verrà eseguito più rapidamente (in effetti, se si digitano sia la variabile fittizia che l'array, si ottiene un ciclo C semplice!). In secondo luogo, nei miei esperimenti anche gli script non tipizzati funzionano un po 'più velocemente a causa del fatto che sono compilati anziché interpretati.
L'altro linguaggio compilato che ti sarà utile è Fortran. Esistono diversi modi per utilizzare Fortran con Python ( f2py , fortwrap , Cython ). Quanto a me personalmente, f2py sembra essere il modo più semplice, descriverò rapidamente cosa fa. f2py può compilare il codice Fortran in moduli Python. Ti permetterà di usare gli array NumPy come variabili di input e output dallo spazio Python. Nello spazio Fortran, questi saranno normali array Fortran. Puoi operare su quelli alla massima velocità di Fortran.
Personalmente, tendo a usare Cython dove il numero di chiamate di funzione è il collo di bottiglia. Per roba pesante, preferisco f2py (forse perché ho un forte background Fortran).
Nota aggiuntiva su Fortran: il moderno Fortran legge e scrive in modo molto simile a NumPy: la sintassi è molto vicina. Ciò semplifica la conversione del codice NumPy in codice Fortran.
Nota che sia Cython che f2py supportano il paralleismo in qualche modo. Per Cython, troverai aiuto qui , mentre per Fortran ci sono tecniche standard come OpenMP o MPI. Inoltre, ci sono anche wrapper P ython per MPI . Personalmente, utilizzo mpi4py a livello Python e OpenMP in Fortran.
Lasciami consigliare un po 'di letteratura: il libro Python Scripting For Computational Science di H.-P. Langtangen è una grande risorsa su Python in generale e sulle strategie per rendere Python un po 'più veloce. Sfortunatamente, AFAIR, non menziona nulla su Cython. Come seconda risorsa puoi guardare queste diapositive . Questi forniscono esempi per tutto ciò che ho menzionato in questo post (vedi anche il codice e le fonti qui ). Ci sono molte altre buone serie di diapositive su Internet.
Se hai domande più specifiche, saremo tutti felici di aiutarti!