web-dev-qa-db-de.com

Welcher Python Speicher-Profiler wird empfohlen?

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 es sich um eine kommerzielle handelt Python Memory Validator (nur Windows).

Und Open Source sind PySizer und Heapy .

Ich habe noch niemanden ausprobiert und wollte wissen, welcher der Besten ist:

  1. Gibt die meisten Details.

  2. Ich muss am wenigsten oder gar nichts an meinem Code ändern.

648
Anurag Uniyal

Heapy ist ganz einfach zu bedienen. Irgendwann in Ihrem Code müssen Sie Folgendes schreiben:

from guppy import hpy
h = hpy()
print h.heap()

Dies gibt Ihnen eine Ausgabe wie diese:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 Tuple
2    530   0   739856   9   4189288  50 dict (no owner)

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.

274
Torsten Marek

Da es noch niemand erwähnt hat, verweise ich auf mein Modul memory_profiler , das in der Lage ist, zeilenweise Berichte über die Speichernutzung zu drucken 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 du deine Funktion mit @profile und starte deinen Code mit dem -m memory_profiler flag es wird ein zeilenweiser Bericht wie folgt gedruckt:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a
341

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, die Liste der Live-Objekte anzeigen und Verweise auf Live-Objekte anzeigen.

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

Sie importieren memdebug und rufen memdebug.start auf. Das ist alles.

Ich habe PySizer oder Heapy nicht ausprobiert. Ich würde mich über Bewertungen anderer freuen.

[~ # ~] Update [~ # ~]

Der obige Code ist für CherryPy 2.X, CherryPy 3.X das server.quickstart Methode wurde entfernt und engine.start nimmt das blocking Flag nicht an. Wenn Sie also CherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()
80
sanxiyn

Betrachten Sie die objgraph Bibliothek (siehe http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks für einen beispielhaften Anwendungsfall).

65
Charles Duffy

Muppy ist (noch ein weiterer) Memory Usage Profiler für Python. Der Schwerpunkt dieses Toolsets liegt auf der Identifizierung von Speicherlecks.

Muppy versucht den Entwicklern zu helfen, Speicherlecks von Python=) - Anwendungen zu identifizieren. Es ermöglicht die Verfolgung der Speichernutzung zur Laufzeit und die Identifizierung von Objekten, die lecken Quelle nicht freigegebener Objekte.

16
Serrano

Ich fand meliae funktioneller als Heapy oder PySizer. Wenn Sie zufällig eine wsgi-Webapp ausführen, ist Dozer ein netter Middleware-Wrapper von Dowser

12

Ich entwickle einen Speicher-Profiler 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:

from memprof import memprof

Und dekorieren Sie Ihre Methode mit:

@memprof

Dies ist ein Beispiel dafür, wie die Diagramme aussehen:

enter image description here

Das Projekt wird in GitHub gehostet:

https://github.com/jmdana/memprof

10
jmdana

Versuchen Sie auch das Pytracemalloc-Projekt , das die Speichernutzung pro Python Zeilennummer angibt.

EDIT (2014/04): Es hat jetzt eine Qt-GUI zum Analysieren von Schnappschüssen.

8
haypo