Ich möchte die Speichernutzung meiner Python-Anwendung kennen und insbesondere wissen, welche Codeblöcke / -teile oder -objekte den meisten Speicher belegen. Die Google-Suche zeigt, dass ein kommerzieller Python Memory Validator (nur Windows) ist.
Und Open Source sind PySizer und Heapy .
Ich habe noch niemanden ausprobiert, deshalb wollte ich wissen, welches das beste ist, wenn man bedenkt:
Gibt die meisten Details.
Ich muss am wenigsten oder gar keine Änderungen an meinem Code vornehmen.
python
performance
memory-management
profiling
Anurag Uniyal
quelle
quelle
Antworten:
Heapy ist recht einfach zu bedienen. Irgendwann in Ihrem Code müssen Sie Folgendes schreiben:
Dies gibt Ihnen eine Ausgabe wie folgt:
Sie können auch herausfinden, wo auf Objekte verwiesen wird, und Statistiken darüber abrufen, aber irgendwie sind die Dokumente dazu etwas spärlich.
Es gibt auch einen grafischen Browser, der in Tk geschrieben ist.
quelle
pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
boost::python
Objekten zu verbessern , wäre es schön, einige Beispiele zu sehen!Da es niemand erwähnt hat, verweise ich auf mein Modul memory_profiler, das zeilenweise Berichte über die Speichernutzung drucken kann und unter Unix und Windows funktioniert (benötigt psutil für dieses letzte Modul). Die Ausgabe ist nicht sehr detailliert, aber das Ziel ist es, Ihnen einen Überblick darüber zu geben, wo der Code mehr Speicher verbraucht, und keine erschöpfende Analyse der zugewiesenen Objekte.
Nachdem Sie Ihre Funktion mit dekoriert
@profile
und Ihren Code mit dem-m memory_profiler
Flag ausgeführt haben, wird ein zeilenweiser Bericht wie folgt gedruckt:quelle
memory_profiler
die Ausgabe? Ich mache vielleicht etwas falsch, aber es scheint, dass das Profil nicht für eine Funktion ausgegeben wird, wenn es abgeschlossen ist, sondern auf das Ende des Skripts wartet.Ich empfehle Dowser . Es ist sehr einfach einzurichten und Sie müssen keine Änderungen an Ihrem Code vornehmen. Über die einfache Weboberfläche können Sie die Anzahl der Objekte jedes Typs im Laufe der Zeit anzeigen, eine Liste der Live-Objekte anzeigen und Verweise auf Live-Objekte anzeigen.
Sie importieren memdebug und rufen memdebug.start auf. Das ist alles.
Ich habe PySizer oder Heapy nicht ausprobiert. Ich würde mich über die Bewertungen anderer freuen.
AKTUALISIEREN
Der obige Code ist für
CherryPy 2.X
,CherryPy 3.X
dieserver.quickstart
Methode wurde entfernt undengine.start
nimmt dasblocking
Flag nicht an . Also, wenn Sie verwendenCherryPy 3.X
quelle
Betrachten Sie die Objektbibliothek (siehehttp://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks für einen beispielhaften Anwendungsfall).
quelle
objgraph.by_type('dict')
zu verstehen, woher all diese unerwartetendict
Objekte kommen.Muppy ist (noch ein weiterer) Memory Usage Profiler für Python. Der Schwerpunkt dieses Toolset liegt auf der Identifizierung von Speicherlecks.
Muppy versucht Entwicklern dabei zu helfen, Speicherlecks in Python-Anwendungen zu identifizieren. Es ermöglicht die Verfolgung der Speichernutzung zur Laufzeit und die Identifizierung von Objekten, die undicht sind. Darüber hinaus werden Tools bereitgestellt, mit denen die Quelle nicht freigegebener Objekte gefunden werden kann.
quelle
Ich entwickle einen Speicherprofiler für Python namens memprof:
http://jmdana.github.io/memprof/
Sie können die Speichernutzung Ihrer Variablen während der Ausführung der dekorierten Methoden protokollieren und grafisch darstellen. Sie müssen die Bibliothek nur importieren mit:
Und dekorieren Sie Ihre Methode mit:
Dies ist ein Beispiel dafür, wie die Diagramme aussehen:
Das Projekt wird in GitHub gehostet:
https://github.com/jmdana/memprof
quelle
a
,b
undc
sind die Namen der Variablen. Die Dokumentation finden Sie unter github.com/jmdana/memprof . Wenn Sie Fragen haben, können Sie gerne ein Problem in github einreichen oder eine E-Mail an die Mailingliste senden, die Sie in der Dokumentation finden.Ich fand Meliae viel funktionaler als Heapy oder PySizer. Wenn Sie zufällig eine wsgi-Webanwendung ausführen, ist Dozer ein netter Middleware-Wrapper von Dowser
quelle
Probieren Sie auch das pytracemalloc-Projekt aus , das die Speichernutzung pro Python-Zeilennummer bereitstellt.
EDIT (2014/04): Es hat jetzt eine Qt-GUI zur Analyse von Schnappschüssen.
quelle
tracemalloc
ist jetzt Teil der Python-Standardbibliothek. Siehe docs.python.org/3/library/tracemalloc.html