Intentaré responder a su pregunta teniendo en cuenta que está solicitando Python específicamente. Describiré mi propio método para abordar un problema de simulación. En esta descripción se dan estrategias para simulaciones más rápidas.
Primero, prototipo de nuevas simulaciones en Python. Por supuesto, trato de usar NumPy y SciPy tanto como puedo. Mientras que NumPy proporciona un tipo de datos de matriz adecuado para simulaciones numéricas, SciPy ofrece una amplia gama de rutinas numéricas que funcionan con matrices NumPy.
Una vez que los prototipos funcionan más o menos, trato de aprender qué partes del programa o script son el cuello de botella. Hay candidatos típicos para eso:
- Los bucles en Python son lentos. Muy lento.
- Como Python usa la escritura de pato , las funciones de llamada pueden ser lentas.
Utilizo una estrategia de perfil simple para aprender dónde se pasa todo el tiempo de ejecución. Utilizando el shell de IPython (que no puedo recomendar lo suficiente), ejecuto mi script con
%timeit script.py
Este "comando mágico" hará el perfil (usando timeit ) por usted y le presentará una lista con los tiempos una vez que su script haya finalizado. Use esta lista para averiguar dónde su código es demasiado lento.
Una vez que haya precisado las partes que deben acelerarse, puede considerar usar lenguajes compilados. Señalaré dos soluciones.
Primero, está el lenguaje Cython . Cython es un lenguaje de programación muy similar a Python (de hecho, el código de Python a menudo también es un código válido de Python); sin embargo, el compilador de Cython convierte los archivos de Cython a código C, que luego puede compilarse en un módulo que se puede usar desde Python. Cython entiende las matrices NumPy. Hay dos formas en que el uso de Cython puede ayudarlo: primero, puede introducir tipos de datos. Esto acelerará las llamadas a funciones. Además, si itera sobre matrices, su ciclo se ejecutará más rápido (de hecho, si escribe tanto la variable ficticia como la matriz, ¡obtendrá un ciclo C simple!). En segundo lugar, en mis experimentos, incluso los scripts sin tipo se ejecutan un poco más rápido debido al hecho de que están compilados en lugar de interpretados.
El otro lenguaje compilado que será útil para usted es Fortran. Hay diferentes formas de usar Fortran con Python ( f2py , fortwrap , Cython ). En lo que a mí respecta, f2py parece ser la forma más fácil, describiré rápidamente lo que hace. f2py puede compilar código Fortran para módulos Python. Le permitirá usar matrices NumPy como variables de entrada y salida desde el espacio Python. En el espacio Fortran, estos serán arreglos Fortran ordinarios. Puede operar en aquellos a toda velocidad de Fortran.
Personalmente, tiendo a usar Cython donde el número de llamadas a funciones es el cuello de botella. Para cosas pesadas en bucle, prefiero f2py (tal vez porque tengo un fuerte fondo Fortran).
En una nota adicional sobre Fortran: Fortran moderno lee y escribe muy similar a NumPy: la sintaxis está muy cerca. Esto facilita la conversión del código NumPy al código Fortran.
Tenga en cuenta que tanto Cython como f2py admiten paralelismo de alguna manera. Para Cython, encontrará ayuda aquí , mientras que para Fortran, existen técnicas estándar como OpenMP o MPI. Además, también hay envoltorios P ython para MPI . Personalmente, uso mpi4py en el nivel de Python, así como OpenMP en Fortran.
Permítanme recomendar un poco de literatura: el libro Python Scripting For Computational Science de H.-P. Langtangen es un gran recurso en Python en general, así como en estrategias para hacer que Python sea un poco más rápido. Desafortunadamente, AFAIR, no menciona nada en Cython. Como segundo recurso, puede mirar estas diapositivas . Estos dan ejemplos de todo lo que mencioné en esta publicación (vea también el código y las fuentes aquí ). Hay muchas otras buenas diapositivas en Internet.
Si tiene preguntas más específicas, ¡todos estamos felices de ayudarlo!