Voy a dividir mi respuesta en tres partes. Perfilado, acelerando el código de python a través de c, y acelerando python a través de python. En mi opinión, Python tiene algunas de las mejores herramientas para ver cuál es el rendimiento de su código y luego profundizar en los cuellos de botella reales. Acelerar el código sin perfilar es como tratar de matar a un ciervo con un uzi.
Si realmente solo está interesado en los productos mat-vec, le recomendaría scipy.sparse .
Herramientas de Python para perfilar
módulos de perfil y perfil c : estos módulos le proporcionarán su análisis de tiempo de ejecución estándar y la pila de llamadas de función. Es bastante agradable guardar sus estadísticas y usar el módulo pstats puede ver los datos de varias maneras.
kernprof : esta herramienta reúne muchas rutinas para hacer cosas como la sincronización de código línea por línea
memory_profiler : esta herramienta produce una huella de memoria línea por línea de su código.
Temporizadores de IPython : latimeit
función es bastante agradable para ver las diferencias en las funciones de una manera interactiva rápida.
Acelerando Python
Cython : cython es la forma más rápida de tomar algunas funciones en python y obtener un código más rápido. Puede decorar la función con la variante cython de python y genera código c. Esto es muy fácil de mantener y también puede vincularse a otro código escrito a mano en c / c ++ / fortran con bastante facilidad. Es, con mucho, la herramienta preferida hoy en día.
ctypes : ctypes le permitirá escribir sus funciones en c y luego envolverlas rápidamente con su simple decoración del código. Maneja todo el dolor de enviar desde PyObjects y administrar el gil para llamar a la función c.
Existen otros enfoques para escribir su código en C, pero todos son algo más para tomar una biblioteca C / C ++ y envolverla en Python.
Enfoques solo para Python
Si desea permanecer dentro de Python principalmente, mi consejo es averiguar qué datos está utilizando y elegir los tipos de datos correctos para implementar sus algoritmos. Según mi experiencia, por lo general, llegarás mucho más lejos al optimizar tus estructuras de datos que cualquier pirateo de bajo nivel. Por ejemplo:
numpy : una matriz continua muy rápida para operaciones de arrays
numexpr : un optimizador de expresiones de matriz numpy. Permite expresiones de matriz numpy de subprocesos múltiples y también elimina los numerosos temporales que hace numpy debido a las restricciones del intérprete de Python.
blist : una implementación de b-tree de una lista, muy rápida para insertar, indexar y mover los nodos internos de una lista
pandas : marcos de datos (o tablas) análisis muy rápidos en las matrices.
pytables : tablas jerárquicas estructuradas rápidas (como hdf5), especialmente buenas para cálculos y consultas fuera de núcleo a datos grandes.