Top 5 Python Memory Profiler

Laut der Stackoverflow-Umfrage von 2019 erhielt die Programmiersprache Python eine Zustimmung von 73,1% unter den Entwicklern. Es steht an zweiter Stelle nach Rust und dominiert weiterhin in den Bereichen Data Science und maschinelles Lernen (ML).

Python ist ein Favorit der Entwickler. Es ist eine Hochsprache, die für ihre Robustheit und ihre Kernphilosophie bekannt ist – Einfachheit über Komplexität. Die Leistung der Python-Anwendung ist jedoch eine andere Geschichte. Genau wie jede andere Anwendung hat es seinen Anteil an Leistungsproblemen.

In den meisten Fällen können APM-Tools wie Retrace zur Lösung von Problemen mit der Anwendungsleistung beitragen. Aber was ist, wenn Ihre Python-Anwendung vier Stunden lang ausgeführt wurde und dem Server der Arbeitsspeicher ausgeht? Das ist ein spezifisches Problem mit Speicherressourcen.

Dies wird als Speicherverlust bezeichnet. Entwickler müssen den Schuldigen finden. Das ist, wenn Python Memory Profiler kommt in.

Lassen Sie uns weiter erforschen.

Was sind Python-Speicherprofiler?

Profiling-Anwendungen beinhalten immer Probleme wie CPU, Speicher usw. Python-Anwendungen sind jedoch anfällig für Speicherverwaltungsprobleme. Dies liegt vor allem daran, dass Python auf Data Science- und ML-Anwendungen angewendet wird und mit großen Datenmengen arbeitet. Außerdem verlässt sich Python standardmäßig auf sein Speicherverwaltungssystem, anstatt es dem Benutzer zu überlassen.

Da Python-Code innerhalb von Containern über ein verteiltes Verarbeitungsframework arbeitet, enthält jeder Container eine feste Menge an Speicher. Wenn die Codeausführung das Speicherlimit überschreitet, wird der Container beendet. Dies ist der Fall, wenn bei der Entwicklung Speicherfehler auftreten.

Dies ist jedoch nicht immer der Fall. Es gibt Fälle, in denen Entwickler nicht wissen, was los ist. Vielleicht hängt ein Objekt an einer Referenz, wenn es nicht sein soll, und baut sich im Laufe der Zeit auf. Sobald es seinen Höhepunkt erreicht hat, treten Speicherprobleme auf.

Die schnelle Lösung besteht darin, die Speicherzuweisung zu erhöhen. Dies ist jedoch nicht praktikabel, da dies zu einer Verschwendung von Ressourcen führen kann. Außerdem kann es die Stabilität der Anwendung aufgrund unvorhersehbarer Speicherspitzen gefährden.

Daher benötigen wir die Hilfe von Python-Speicherprofilern. Der Zweck von Python-Speicherprofilern besteht darin, Speicherlecks zu finden und die Speichernutzung in Ihren Python-Anwendungen zu optimieren. Diese Arten von Python-Speicherprofilern verstehen die Speicherplatzeffizienz des verwendeten Codes und der verwendeten Pakete.

Top Python Memory Profiler

Obwohl Python automatisch Speicher verwaltet, benötigt es Tools, da lang laufende Python-Jobs viel Speicher verbrauchen. In den meisten Fällen geben diese Aufträge den Speicher erst nach Beendigung des Prozesses an das Betriebssystem zurück, selbst wenn die Speicherbereinigung ordnungsgemäß ausgeführt wird.

Hier ist eine Liste bekannter Python-Speicherprofiler:

Pympler

Jean Brouwers, Ludwig Haehne und Robert Schuppenies bauten Pympler im August 2008. Sie führten den Pympling-Prozess ein, bei dem Pympler Details zur Größe und Lebensdauer von Python-Objekten erhält.

Pymplers Python Memory Profiler analysiert das Speicherverhalten des Python-Objekts in einer laufenden Anwendung. Es bietet eine vollständige und eigenständige Python-Speicherprofilerstellungslösung. Außerdem projiziert es mögliche Fehler im Laufzeitverhalten wie Speicher aufblasen und andere „Pymples.“

Es gibt drei separate Module in Pympler.

  • Das asizeof-Modul liefert die Größeninformationen des Python-Objekts.
  • Das Muppy-Modul dient der Online-Überwachung einer Python-Anwendung.
  • Das Modul Class Tracker bietet eine Offline-Analyse der Lebensdauer ausgewählter Python-Objekte.

Lassen Sie uns zunächst mit asizeof untersuchen, wie viel Speicher bestimmte Python-Objekte verbrauchen.

>>> from pympler import asizeof

>>> obj =

>>> asizeof.asizeof(obj)

>>> print (asizeof.asized(obj, detail=1).format())

Größe=192 flach=48

(6, 4) Größe=64 flach=32

‚i‘ Größe=32 flach=32

3 Größe=16 flach=16

2 Größe=16 flach=16

1 Größe=16 flach=16

Zweitens implementieren wir das Muppy-Modul:

>>> von pympler muppy importieren

>>> allObjects = muppy.get_objects()

>>> len(allObjects)

>>> von pympler Zusammenfassung importieren

>>> I = Zusammenfassung.zusammenfassung(allObjects)

>>> Zusammenfassung.print_(sum)

types | # objects | total size
========================== | =========== | ============
str | 13262 | 1.01 MB
dict | 2120 | 659.99 KB
code | 3362 | 343.73 KB
list | 2587 | 247.46 KB
type | 639 | 242.61 KB
tuple | 2069 | 58.83 KB
set | 86 | 44.57 KB
wrapper_descriptor | 1247 | 43.84 KB
builtin_function_or_method | 1014 | 35.65 KB
method_descriptor | 937 | 32.94 KB
abc.ABCMeta | 66 | 32.38 KB
weakref | 818 | 28.76 KB
int | 1612 | 24.72 KB
getset_descriptor | 555 | 17,34 KB
frozenset | 90 | 16,87 KB

Hier können Sie alle Python-Objekte in einem Heap mit dem Muppy-Modul anzeigen. Sie können eine andere Zusammenfassung aufrufen und vergleichen, um zu überprüfen, ob einige Arrays Speicherlecks aufweisen. Erfahren Sie hier mehr über das Muppy-Modul.

Das dritte Modul im Pympler-Profiler ist der Klassen-Tracker. Es verfolgt die Lebensdauer von Objekten bestimmter Klassen. Thus, it provides insight into instantiation patterns and helps developers understand how specific objects contribute to the memory footprint in the long run.

>>> tr = classtracker.ClassTracker()

>>> tr.track_class(Document)

>>> tr.create_snapshot(description=’Snapshot 1′)

>>> doc = create_document()

>>> tr.create_snapshot(description=’Snapshot 2′)

>>> tr.stats.print_summary()

— ZUSAMMENFASSUNG ———————-

Momentaufnahme 1 aktiv 0 B durchschnittlicher pct

Momentaufnahme 2 aktiv 0 B durchschnittlicher pct

—————————

Um mehr über Class Tracker zu erfahren, klicken Sie hier.

Guppy3

Guppy3 (auch bekannt als Heapy) ist eine Python-Programmierumgebung und ein Heap-Analyse-Toolset. Es ist ein Paket, das die folgenden Unterpakete enthält:

  • etc – Dies ist ein Unterstützungsmodul mit dem Glue-Protokollmodul.
  • gsl – Das Unterpaket, das die Implementierung der Guppy-Spezifikationssprache enthält. Es erstellt Dokumente und Tests aus einer gemeinsamen Quelle.
  • heapy – Das Heap-Analyse-Toolset stellt Objektinformationen zum Heap bereit und zeigt die Informationen an.
  • sets – Enthält Bitsets und Nodesets.

Guppy3 ist ein Fork von Guppy-PE und wurde von Sverker Nilsson für Python 2 entwickelt.Hinweis: Die Verwendung dieses Python-Speicherprofilers erfordert Python 3.5, 3.6, 3.7 oder 3.8. Dieses Paket funktioniert nur für CPython. Daher werden PyPy und andere Python-Compiler-Implementierungen nicht unterstützt. Um den grafischen Browser verwenden zu können, wird Tkinter benötigt. Außerdem muss Threading verfügbar sein, wenn ein Remote-Monitor verwendet wird.

Hier erfahren Sie, wie Sie diesen Python-Speicherprofiler nutzen können. Sie können einen Snapshot des Heaps vor und nach einem kritischen Prozess erstellen. Vergleichen Sie dann den Gesamtspeicher und ermitteln Sie mögliche Speicherspitzen in gemeinsamen Objekten.

>>> from guppy import hpy

>>> h=hpy()

>>> h.heap()

Partition of a set of 34090 objects. Total size = 2366226 bytes.

Index Count % Size % Cumulative % Kind (class / dict of class)
0 10279 30 666873 28 666873 28 str
1 4697 14 259576 11 926449 39 bytes
2 2413 7 251684 11 1178133 50 types.CodeType
3 6825 20 238084 10 1416217 60 tuple
4 448 1 174868 7 1591085 67 type
5 2208 6 150144 6 1741229 74 function
6 448 1 130964 6 1872193 79 dict of type
7 94 0 83532 4 1955725 83 dict of module
8 242 1 56524 2 2012249 85 dict (no owner)
9 1133 3 40788 2 2053037 87 types.WrapperDescriptorType

<118 more rows. Type e.g. ‘_.more’ to view.>

Memory Profiler

Memory Profiler is a pure Python module that uses the psutil module. Es überwacht den Speicherverbrauch eines Python-Jobprozesses. Außerdem führt es eine zeilenweise Analyse des Speicherverbrauchs der Anwendung durch.

Der zeilenweise Speicherauslastungsmodus funktioniert genauso wie der line_profiler.

  1. Es schmückt die Funktion, die Sie mit der Funktion @profile profilieren möchten.
  2. Sie können das Skript mit einem speziellen Skript ausführen. Verwenden Sie beispielsweise bestimmte Argumente für den Python-Interpreter.

Im folgenden Beispiel haben wir eine einfache Funktion namens my_func . Diese Funktion erstellt eine Liste mit einem angegebenen Bereich.

@profile

def my_func():

a=

for i in range(1000):

a.append(i)

my_func()

This outputs:

Line # Mem Usage Increment Line Contents
1 13.859 MiB 13.859 MiB @profile
2 def my_func():
3 13.859 MiB 0.000 MiB a=
4 13.859 MiB 0.000 MiB für i im Bereich(1000):
5 13,859 MiB 0,000 MiB a.anhängen(i)

Die erste Spalte ist die Zeilennummer des profilierten Codes. Mem usage ist die Speichernutzung des Python-Interpreters nach jeder Codeausführung. Die dritte Spalte (Inkrement) stellt die Speicherdifferenz der aktuellen Zeile zur letzten dar. In der letzten Spalte (Zeileninhalt) werden die profilierten Codes angezeigt.

To see how this Python memory profiler works, let’s change the range value to 1000000 in the function above and execute it. Here is the output:

Line # Mem usage Increment Line Contents
1 13.844 MiB 13.844 MiB @profile
2 def my_func():
3 13.844 MiB 0.000 MiB a=
4 33.387 MiB 0.016 MiB für i im Bereich(1000000):
5 33,387 MiB 0,293 MiB a.anhängen(i)

Zeile 4 und 5 zeigen eine Zunahme der Speichernutzung, was beweist, dass dieser Profiler eine zeilenweise Analyse des Speicherverbrauchs durchführt.

Fil

Fil Profiler ist ein Open-Source-Python-Speicherprofiler. Es ist geeignet für daten verarbeitung und wissenschaftliche computing anwendungen. Derzeit befindet es sich noch in der Entwicklungsphase und läuft nur unter Linux und macOS.

Die meisten Datenwissenschaftler und Python-Entwickler haben Speicherprobleme mit der Python-Datenpipeline. Wenn es zu viel Speicher verwendet, ist es schwierig, genau zu bestimmen, wohin genau der gesamte Speicher geht.

Lassen Sie uns zum Beispiel zwei Szenarien anführen:

Server

Da Server ohne Unterbrechung laufen, sind Speicherlecks häufig die Ursache für Leistungsstörungen. Entwickler vernachlässigen kleine Mengen an Speicherverlust, da die meisten Server kleine Datenmengen gleichzeitig verarbeiten. Diese können sich jedoch zu Zehntausenden von Anrufen summieren. Infolgedessen kann dies im Laufe der Zeit zu schwerwiegenden Produktionsproblemen führen.

Datenpipelines

Bei der Verarbeitung großer Datenmengen stellen Spitzen in der Speichernutzung eine enorme Bedrohung für Datenpipelines dar. Zum Beispiel, wenn Ihre Anwendung 1 GB RAM für einige Zeit verwendet und dann plötzlich 16 GB RAM benötigt. Es besteht ein großer Bedarf zu identifizieren, was plötzliche Gedächtnisspitzen verursacht.

Das ist das Hauptziel von Fil ― Speichernutzungsspitzen zu diagnostizieren, unabhängig von der Menge der verarbeiteten Daten. Es zeigt genau an, wo genau die maximale Speichernutzung liegt und welcher Code für diese Spitze verantwortlich ist.

Obwohl es Python-Speicherprofiler gibt, die die Speichernutzung messen, gibt es Einschränkungen. Eines davon beschäftigt sich mit riesigen Datenmengen – der Stapelverarbeitung. Python-Anwendungen sind meist Stapelverarbeitungsanwendungen, bei denen sie ständig Daten lesen, verarbeiten und das Ergebnis ausgeben.

Dieses Problem wird von unserem nächsten Profiler beantwortet.

Blackfire

Bei einer hochdynamischen Sprache wie Python treten bei den meisten Entwicklern Speicherprobleme während der Bereitstellung auf. Dies führt zu Verwirrung darüber, was mit der Speichernutzung passiert. Entwickler neigen dazu, Optimierungen durchzuführen, verfügen jedoch nicht über die richtigen Tools.

Blackfire ist ein proprietärer Python-Speicherprofiler (vielleicht der erste. Es verwendet Pythons Speichermanager, um jeden von Python zugewiesenen Speicherblock einschließlich C-Erweiterungen zu verfolgen. Blackfire ist neu auf dem Gebiet und zielt darauf ab, Probleme bei Speicherlecks zu lösen, wie z:

  • große Objekte im Speicher, die nicht freigegeben werden
  • Referenzzyklen
  • Ungültige Referenzzählung in C-Erweiterungen, die Speicherlecks verursachen
  • plötzliche Speicherspitzen

In diesen Anwendungsfällen versichert Blackfire den Benutzern, dass der Overhead sehr begrenzt ist und sich nicht auf die Endbenutzer auswirkt, da der Speicherverbrauch der Python-Anwendung auf Funktionsaufrufebene gemessen wird.

Blackfire Python Memory Profiler verwendet die PyMem_SetAllocator API, um Speicherzuweisungen wie tracemalloc zu verfolgen. Derzeit unterstützt Blackfire Python-Versionen 3.5 und höher. Sie können seine Website besuchen, um mehr zu erfahren.

Profiling mit Retrace

Wenn Sie mit Python arbeiten, erleben Sie irgendwie, dass es nicht sofort Speicher an das Betriebssystem zurückgibt. Daher führen Sie es in einem separaten Prozess aus, um sicherzustellen, dass nach der Ausführung eines Codeteils Speicher freigegeben wird. Dies geschieht durch einen nützlichen Ansatz namens „kleiner Testfall.“ Dieser Prozess ermöglicht es, nur den fraglichen Speicherleckcode auszuführen.

Verwenden Sie bei großen Datenmengen eine Teilmenge der zufällig abgetasteten Daten. Führen Sie außerdem speicherintensive Aufgaben in separaten Prozessen aus und verwenden Sie Debugger, um Referenzen zu Objekten hinzuzufügen. Beachten Sie jedoch, dass bei Verwendung eines Haltepunkt-Debuggers wie pdb alle Objekte, die manuell vom Debugger erstellt und referenziert werden, im Speicherprofil verbleiben. Dies führt zu einem falschen Gefühl von Speicherlecks, da Objekte nicht rechtzeitig freigegeben werden. Erwägen Sie außerdem, Pakete zu untersuchen, die undicht sein können. Es gibt Python-Bibliotheken, die möglicherweise Speicherlecks aufweisen können.

Inzwischen wissen Sie bereits, wie Python-Speicherprofiler funktionieren und welche Speicherprobleme mit Python häufig auftreten. Tools wie Retrace mit zentralisierter Protokollierung, Fehlerverfolgung und Codeprofilierung können Ihnen jedoch dabei helfen, Python-Probleme in größerem Maßstab zu diagnostizieren. Retrace von Stackify wird Ihnen helfen, mit allen Arten von Performance-Fallstricken umzugehen und Ihren Code gut laufen zu lassen.

Starten Sie noch heute Ihre 14-tägige KOSTENLOSE Retrace-Testversion!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.