Ich werde meine Antwort in drei Teile aufteilen. Profilerstellung, Beschleunigung des Python-Codes über c und Beschleunigung des Python-Codes über python. Ich bin der Meinung, dass Python einige der besten Tools bietet, um die Leistung Ihres Codes zu überprüfen und die tatsächlichen Engpässe zu ermitteln. Das Beschleunigen von Code ohne Profilerstellung ähnelt dem Versuch, ein Reh mit einem Uzi zu töten.
Wenn Sie sich wirklich nur für Produkte von mat-vec interessieren, empfehle ich scipy.sparse .
Python-Tools für die Profilerstellung
Profile- und cProfile-Module : Mit diesen Modulen erhalten Sie Ihre Standard-Laufzeitanalyse und Ihren Funktionsaufruf-Stack. Es ist sehr schön, ihre Statistiken zu speichern und mit dem pstats-Modul können Sie die Daten auf verschiedene Arten anzeigen.
kernprof : Dieses Tool stellt viele Routinen zusammen, um Dinge wie zeilenweise Code-Timing durchzuführen
memory_profiler : Dieses Tool erstellt einen zeilenweisen Speicher- Footprint Ihres Codes.
IPython-Timer : Dietimeit
Funktion ist sehr hilfreich, um die Funktionsunterschiede schnell und interaktiv zu erkennen.
Python beschleunigen
Cython : Cython ist der schnellste Weg, um einige Funktionen in Python zu übernehmen und schnelleren Code zu erhalten. Sie können die Funktion mit der Cython-Variante von Python dekorieren und sie generiert C-Code. Dies ist sehr wichtig und kann auch leicht mit anderem Code in c / c ++ / fortran verknüpft werden. Es ist bei weitem das bevorzugte Werkzeug heute.
ctypes : Mit ctypes können Sie Ihre Funktionen in c schreiben und sie dann schnell mit der einfachen Dekoration des Codes umbrechen. Es behandelt alle Probleme, die mit dem Casting von PyObjects und der Verwaltung des Gil-Befehls zum Aufrufen der c-Funktion verbunden sind.
Es gibt andere Ansätze, um Ihren Code in C zu schreiben, aber alle sind etwas mehr, um eine C / C ++ - Bibliothek zu nehmen und in Python zu verpacken.
Python-only-Ansätze
Wenn Sie hauptsächlich in Python bleiben möchten, ist mein Rat, herauszufinden, welche Daten Sie verwenden, und die richtigen Datentypen für die Implementierung Ihrer Algorithmen auszuwählen. Ich habe die Erfahrung gemacht, dass Sie in der Regel viel weiter kommen, wenn Sie Ihre Datenstrukturen optimieren, als wenn Sie einen Hack auf niedriger Ebene ausführen. Beispielsweise:
numpy : Ein fortlaufendes Array, das für schrittweise Operationen von Arrays sehr schnell ist
numexpr : ein Optimierer für numpy-Array-Ausdrücke. Es ermöglicht Multithreading-Numpy-Array-Ausdrücke und beseitigt die zahlreichen temporären Numpy-Ausdrücke aufgrund von Einschränkungen des Python-Interpreters.
Blist : Eine B-Tree-Implementierung einer Liste, die sich sehr schnell zum Einfügen, Indizieren und Verschieben der internen Knoten einer Liste eignet
Pandas : Datenrahmen (oder Tabellen) sehr schnelle Analysen auf den Arrays.
pytables : Schnell strukturierte hierarchische Tabellen (wie hdf5), besonders geeignet für Berechnungen außerhalb des Kerns und Abfragen zu großen Datenmengen.