752 Stimmen

Welcher Python-Speicher-Profiler wird empfohlen?

Ich möchte den Speicherverbrauch meiner Python-Anwendung kennen und insbesondere wissen, welche Codeblöcke/Portionen oder Objekte den meisten Speicher verbrauchen. Die Google-Suche zeigt, dass ein kommerzielles Programm ist Python-Speicher-Validator (nur Windows).

Und Open-Source-Produkte sind PySizer y Heapy .

Ich habe noch keinen ausprobiert, deshalb wollte ich wissen, welcher der beste ist:

  1. Enthält die meisten Details.

  2. Ich muss nur wenige oder gar keine Änderungen an meinem Code vornehmen.

489voto

Fabian Pedregosa Punkte 6009

Mein Modul speicher_profiler ist in der Lage, einen zeilenweisen Bericht über die Speichernutzung auszugeben und funktioniert unter Unix und Windows (für letzteres wird psutil benötigt). 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 nicht eine erschöpfende Analyse der zugewiesenen Objekte.

Nach der Dekoration Ihrer Funktion mit @profile und die Ausführung Ihres Codes mit dem -m memory_profiler wird ein zeilenweiser Bericht wie dieser 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

311voto

Torsten Marek Punkte 78610

Guppy3 ist recht einfach zu verwenden. An irgendeiner Stelle in Ihrem Code müssen Sie Folgendes schreiben:

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

Sie erhalten dann 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)

Man kann auch herausfinden, von wo aus Objekte referenziert werden und Statistiken darüber erhalten, aber irgendwie sind die Unterlagen dazu etwas spärlich.

Es gibt auch einen grafischen Browser, der in Tk geschrieben ist.

Für Python 2.x, verwenden Sie Heapy .

84voto

sanxiyn Punkte 3610

Ich empfehle Wünschelrutengänger . Es ist sehr einfach einzurichten, und Sie brauchen keine Änderungen an Ihrem Code vorzunehmen. Sie können die Anzahl der Objekte jedes Typs im Laufe der Zeit, die Liste der aktiven Objekte und die Verweise auf aktive Objekte über eine einfache Webschnittstelle 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 war's schon.

Ich habe PySizer oder Heapy nicht ausprobiert. Ich würde andere Bewertungen zu schätzen wissen.

UPDATE

Der obige Code ist für CherryPy 2.X , CherryPy 3.X le site server.quickstart Methode wurde entfernt und engine.start nimmt nicht die blocking Flagge. 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()

70voto

Charles Duffy Punkte 255246

Betrachten Sie die objgraph Bibliothek (siehe dieser Blogbeitrag für einen beispielhaften Anwendungsfall).

19voto

Serrano Punkte 1367

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

Muppy versucht, Entwicklern zu helfen, Speicherlecks in Python-Anwendungen zu identifizieren. Es ermöglicht die Verfolgung der Speichernutzung während der Laufzeit und die Identifizierung von Objekten, die undicht sind. Zusätzlich werden Werkzeuge bereitgestellt, die es ermöglichen, die Quelle der nicht freigegebenen Objekte zu lokalisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X