Je vais diviser ma réponse en trois parties. Profilage, accélération du code python via c et accélération de python via python. À mon avis, Python possède certains des meilleurs outils pour analyser les performances de votre code, puis remonter jusqu'aux goulots d'étranglement. Accélérer le code sans profiler, c'est comme essayer de tuer un cerf avec un uzi.
Si vous n'êtes vraiment intéressé que par les produits mat-vec, je recommanderais scipy.sparse .
Outils Python pour le profilage
modules de profil et cProfile : Ces modules vous donneront votre analyse d'exécution standard et votre pile d'appels de fonctions. Il est assez agréable d'enregistrer leurs statistiques et en utilisant le module pstats, vous pouvez consulter les données de plusieurs façons.
kernprof : cet outil rassemble de nombreuses routines pour faire des choses comme le minutage du code ligne par ligne
memory_profiler : cet outil produit une empreinte mémoire ligne par ligne de votre code.
Minuteries IPython : Latimeit
fonction est assez agréable pour voir les différences de fonctions d'une manière interactive rapide.
Accélérer Python
Cython : cython est le moyen le plus rapide de prendre quelques fonctions en python et d'obtenir un code plus rapide. Vous pouvez décorer la fonction avec la variante cython de python et elle génère du code c. Ceci est très maintenable et peut également être lié à d'autres codes manuscrits en c / c ++ / fortran assez facilement. C'est de loin l'outil préféré aujourd'hui.
ctypes : ctypes vous permettra d'écrire vos fonctions en c puis de les envelopper rapidement avec sa décoration simple du code. Il gère toute la douleur du casting de PyObjects et de la gestion du gil pour appeler la fonction c.
D'autres approches existent pour écrire votre code en C mais elles sont toutes un peu plus pour prendre une bibliothèque C / C ++ et l'envelopper en Python.
Approches Python uniquement
Si vous souhaitez rester principalement dans Python, mon conseil est de déterminer quelles données vous utilisez et de choisir les types de données appropriés pour implémenter vos algorithmes. D'après mon expérience, vous obtiendrez généralement beaucoup plus loin en optimisant vos structures de données, puis tout hack c de bas niveau. Par exemple:
numpy : un tableau contingent très rapide pour les opérations stridées de tableaux
numexpr : un optimiseur d'expression de tableau numpy. Il permet des expressions de tableau numpy multithreading et supprime également les nombreuses marques temporaires de numpy en raison des restrictions de l'interpréteur Python.
blist : une implémentation b-tree d'une liste, très rapide pour l'insertion, l'indexation et le déplacement des nœuds internes d'une liste
pandas : trames de données (ou tableaux) analyses très rapides sur les tableaux.
pytables : tableaux hiérarchiques structurés rapides (comme hdf5), particulièrement adaptés aux calculs hors du noyau et aux requêtes sur des données volumineuses.