Generische Frage zu Python-Code. Wie kann ich die schlimmsten Teile meines Python-Codes hinsichtlich der Speichernutzung am effektivsten lokalisieren?
Siehe z.B. Dieses kleine Beispiel
%Vor% Wie kann ich auf automatisierte Weise sagen, dass a2 viel größer als a1 ist?
Und wie kann ich - noch automatisiert - auf my_func1()
und my_func2()
zurückwachsen?
Für C / C ++ Code würde ich valgrind --tool=massif
verwenden, was die Schwergewichte bezüglich der Speichernutzung direkt lokalisieren kann - aber für Python brauche ich Ihre Hilfe.
Meliae scheint etwas von der Antwort zu geben, aber nicht annähernd so gut wie das Massiv für C / C ++.
local () (bzw. globals ()) gibt ein Dictionary mit allen lokalen (bzw. globalen) Alive-Objekten zurück. Sie können sie wie folgt verwenden:
%Vor% Der Nachteil ist, dass Objekte, die __getsizeof__
nicht vollständig implementiert haben, wie Numpy-Arrays oder Referenzen, nicht erkannt werden. Zum Beispiel, wenn Sie:
Die Ausgabe ist:
%Vor%Und natürlich wird gerade das Löschen von a1 seine 82 k nicht freigeben, weil es immer noch eine Referenz in a1 gibt. Aber wir können es noch seltsamer machen:
%Vor%Und die Ausgabe wird seltsam vertraut aussehen:
%Vor%Andere Tools implementieren möglicherweise Problemumgehungen und durchsuchen den Referenzbaum. Das allgemeine Problem einer vollständigen Speicheranalyse in Python bleibt jedoch ungelöst. Und dies wird gerade schlechter, wenn Objekte Daten über die C-API außerhalb des Bereichs des Referenzzählers speichern, der z. passiert mit Numpy-Arrays.
Das heißt, es gibt Werkzeuge, die für die meisten praktischen Situationen "gut genug" sind. Wie in dem Verweis, auf den verwiesen wird, ist Heapy eine sehr gute Option.