Zephyrnet-Logo

Einführung in die Speicherprofilerstellung in Python – KDnuggets

Datum:

Einführung in die Speicherprofilerstellung in Python
Bild vom Autor
 

Die Profilierung von Python-Code ist hilfreich, um zu verstehen, wie der Code funktioniert, und um Möglichkeiten zur Optimierung zu identifizieren. Sie haben wahrscheinlich ein Profil für Ihre Python-Skripte erstellt zeitbezogene Kennzahlen– Messung der Ausführungszeiten bestimmter Codeabschnitte. 

Aber die Profilerstellung für den Speicher – um die Speicherzuweisung und -freigabe während der Ausführung zu verstehen – ist genauso wichtig. Denn die Speicherprofilierung kann dabei helfen, Speicherlecks, Ressourcenauslastung und potenzielle Probleme bei der Skalierung zu identifizieren. 

In diesem Tutorial untersuchen wir die Profilierung von Python-Code für die Speichernutzung mithilfe des Python-Pakets Speicher-Profiler.

Beginnen wir mit der Installation des Python-Pakets „Memory-Profiler“ mit pip:

pip3 install memory-profiler

 

Note: Installieren Sie den Memory-Profiler in einem dedizierten virtuelle Umgebung für das Projekt statt in Ihrer globalen Umgebung. Wir werden auch die im Memory-Profiler verfügbaren Plotfunktionen verwenden, um die erforderliche Speichernutzung darzustellen Matplotlib. Stellen Sie daher sicher, dass matplotlib auch in der virtuellen Umgebung des Projekts installiert ist.

Lassen Sie uns ein Python-Skript (z. B. main.py) mit einer Funktion erstellen process_strs:

  • Die Funktion erstellt zwei superlange Python-Strings str1 und str2 und verkettet sie. 
  • Das Schlüsselwortargument reps Steuert die Häufigkeit, mit der die fest codierten Zeichenfolgen zum Erstellen wiederholt werden sollen str1 und str2. Und wir geben ihm einen Standardwert von 10**6, der verwendet wird, wenn die aufgerufene Funktion den Wert von nicht angibt reps.
  • Wir löschen dann explizit str2
  • Die Funktion gibt die verkettete Zeichenfolge zurück str3.
# main.py

from memory_profiler import profile

@profile
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

Wenn Sie das Skript ausführen, sollten Sie eine ähnliche Ausgabe erhalten: 

 

Einführung in die Speicherprofilerstellung in Python
 

Wie in der Ausgabe zu sehen ist, können wir den verwendeten Speicher, die Erhöhung bei jeder nachfolgenden String-Erstellung und den String-Löschschritt sehen, der einen Teil des verwendeten Speichers freigibt.

Ausführen des mprof-Befehls 

Anstatt das Python-Skript wie oben gezeigt auszuführen, können Sie auch Folgendes ausführen mprof Befehl etwa so:

mprof run --python main.py

 

Wenn Sie diesen Befehl ausführen, sollten Sie auch eine .dat-Datei mit den Speichernutzungsdaten sehen können. Sie erhalten jedes Mal eine .dat-Datei, wenn Sie das ausführen mprof Befehl – ​​identifiziert durch den Zeitstempel.

 

Einführung in die Speicherprofilerstellung in Python

Speichernutzung grafisch darstellen 

Manchmal ist es einfacher, die Speichernutzung anhand eines Diagramms zu analysieren, als sich Zahlen anzusehen. Denken Sie daran, dass wir besprochen haben, dass Matplotlib eine erforderliche Abhängigkeit ist, um die Plotfunktionen nutzen zu können. 

Sie können die Verwendung mprof plot Befehl zum Plotten der Daten in der .dat-Datei und zum Speichern in einer Bilddatei (hier „output.png“):

mprof plot -o output.png

 

Standardmäßig mprof plot Verwendete die Daten aus dem letzten Lauf des mprof Befehl.

 

Einführung in die Speicherprofilerstellung in Python
 

Sie können die im Plot erwähnten Zeitstempel auch sehen.

Protokollierung des Speichernutzungsprofils in einer Protokolldatei

Alternativ können Sie die Speichernutzungsstatistiken in einer bevorzugten Protokolldatei im Arbeitsverzeichnis protokollieren. Hier erstellen wir einen Dateihandler mem_logs in die Protokolldatei und legen Sie die fest stream Argument in der @profile Dekorator für den Dateihandler:

# main.py

from memory_profiler import profile

mem_logs = open('mem_profile.log','a')

@profile(stream=mem_logs)
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

Wenn Sie nun das Skript ausführen, sollten Sie die Datei mem_profile.log in Ihrem Arbeitsverzeichnis mit folgendem Inhalt sehen können:

 

Einführung in die Speicherprofilerstellung in Python

Sie können auch die Tasten memory_usage() Funktion, um die Ressourcen zu verstehen, die für die Ausführung einer bestimmten Funktion erforderlich sind – in regelmäßigen Zeitintervallen abgetastet.

Das memory_usage Die Funktion übernimmt die Funktion zum Profilieren, Positions- und Schlüsselwortargumente als Tupel.

Hier möchten wir die Speichernutzung ermitteln process_strs Funktion mit dem Schlüsselwortargument reps auf 10**7 eingestellt. Außerdem stellen wir das Abtastintervall auf 0.1 s ein:

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.1)
print(mem_used)

 

Hier ist die entsprechende Ausgabe:

Output >>>
[21.21875, 21.71875, 147.34375, 277.84375, 173.93359375]

 

Sie können das Abtastintervall auch danach anpassen, wie oft die Speichernutzung erfasst werden soll. Als Beispiel stellen wir das Intervall auf 0.01 s ein; Das heißt, wir erhalten jetzt eine detailliertere Ansicht des genutzten Speichers.

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.01)
print(mem_used)

 

Sie sollten eine ähnliche Ausgabe sehen können:

Output >>>
[21.40234375, 21.90234375, 33.90234375, 46.40234375, 59.77734375, 72.90234375, 85.65234375, 98.40234375, 112.65234375, 127.02734375, 141.27734375, 155.65234375, 169.77734375, 184.02734375, 198.27734375, 212.52734375, 226.65234375, 240.40234375, 253.77734375, 266.52734375, 279.90234375, 293.65234375, 307.40234375, 321.27734375, 227.71875, 174.1171875]

In diesem Tutorial haben wir gelernt, wie man mit der Profilierung von Python-Skripten für die Speichernutzung beginnt.

Konkret haben wir gelernt, wie das mit dem Paket „memory-profiler“ geht. Wir haben das genutzt @profile Dekorateur und der memory_usage() Funktion, um die Speichernutzung eines Beispiel-Python-Skripts abzurufen. Wir haben auch gelernt, wie man die Funktionen nutzt, z. B. die Speichernutzung grafisch darstellt und die Statistiken in einer Protokolldatei erfasst.

Wenn Sie daran interessiert sind, Ihr Python-Skript hinsichtlich der Ausführungszeiten zu profilieren, sollten Sie Folgendes lesen Profilierung von Python-Code mit timeit und cProfile.
 
 

Bala Priya C ist ein Entwickler und technischer Redakteur aus Indien. Sie arbeitet gerne an der Schnittstelle von Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Zu ihren Interessen- und Fachgebieten gehören DevOps, Datenwissenschaft und Verarbeitung natürlicher Sprache. Sie liebt es zu lesen, zu schreiben, zu programmieren und Kaffee zu trinken! Derzeit arbeitet sie daran, zu lernen und ihr Wissen mit der Entwickler-Community zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr verfasst.

spot_img

Neueste Intelligenz

spot_img