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
undstr2
und verkettet sie. - Das Schlüsselwortargument
reps
Steuert die Häufigkeit, mit der die fest codierten Zeichenfolgen zum Erstellen wiederholt werden sollenstr1
undstr2
. Und wir geben ihm einen Standardwert von 10**6, der verwendet wird, wenn die aufgerufene Funktion den Wert von nicht angibtreps
. - 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:
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.
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.
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:
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.
- SEO-gestützte Content- und PR-Distribution. Holen Sie sich noch heute Verstärkung.
- PlatoData.Network Vertikale generative KI. Motiviere dich selbst. Hier zugreifen.
- PlatoAiStream. Web3-Intelligenz. Wissen verstärkt. Hier zugreifen.
- PlatoESG. Kohlenstoff, CleanTech, Energie, Umwelt, Solar, Abfallwirtschaft. Hier zugreifen.
- PlatoHealth. Informationen zu Biotechnologie und klinischen Studien. Hier zugreifen.
- Quelle: https://www.kdnuggets.com/introduction-to-memory-profiling-in-python?utm_source=rss&utm_medium=rss&utm_campaign=introduction-to-memory-profiling-in-python