Speicherprofiling mit tracemalloc
Verfolgen Sie Speicherzuweisungen und finden Sie Lecks mit tracemalloc.
Speicherprofiling mit tracemalloc ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist tracemalloc?
tracemalloc ist ein Modul der Standardbibliothek, das Python-Speicherzuweisungen nach Datei und Zeilennummer erfasst.
import tracemalloc
tracemalloc.start()
x = [i for i in range(100_000)]
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Current: {current/1024:.1f} KB")
print(f"Peak: {peak/1024:.1f} KB")Snapshots erstellen
Ein Snapshot erfasst alle aktuellen Speicherzuweisungen zu einem bestimmten Zeitpunkt. Vergleichen Sie zwei Snapshots, um festzustellen, was zwischen ihnen zugewiesen wurde.
import tracemalloc
tracemalloc.start()
snap1 = tracemalloc.take_snapshot()
data = [{"key": str(i)} for i in range(10_000)]
snap2 = tracemalloc.take_snapshot()
stats = snap2.compare_to(snap1, "lineno")
for stat in stats[:5]:
print(stat)Snapshots filtern
Filtern Sie die Statistiken so, dass nur der Code Ihrer Anwendung angezeigt wird und die Standardbibliothek ausgeschlossen bleibt.
import tracemalloc
tracemalloc.start()
leak_function()
snap = tracemalloc.take_snapshot()
filters = [tracemalloc.Filter(True, "*/myapp/*")]
stats = snap.filter_traces(filters).statistics("lineno")
for stat in stats[:10]:
print(stat)Größte Speicherverbraucher
Verwenden Sie snapshot.statistics("lineno") oder "traceback", um die größten Speicherverbraucher nach Zeile oder anhand des vollständigen Tracebacks anzuzeigen.
import tracemalloc
tracemalloc.start(nframe=10) # track 10 frames deep
big_list = [i**2 for i in range(500_000)]
snap = tracemalloc.take_snapshot()
for stat in snap.statistics("traceback")[:3]:
print(stat)
for line in stat.traceback.format():
print(" ", line)Speicherlecks finden
Erstellen Sie zwei Snapshots rund um ein vermutetes Speicherleck und vergleichen Sie sie. Wachsende Statistiken zwischen den Snapshots weisen auf ein Speicherleck hin.
import tracemalloc
tracemalloc.start()
snap_before = tracemalloc.take_snapshot()
for _ in range(100):
suspected_leaky_function()
snap_after = tracemalloc.take_snapshot()
diff = snap_after.compare_to(snap_before, "lineno")
for stat in diff[:5]:
print(stat)get_traced_memory()
tracemalloc.get_traced_memory() gibt (current, peak) in Byte zurück – nützlich für einfache Vorher-Nachher-Prüfungen.
import tracemalloc
tracemalloc.start()
before, _ = tracemalloc.get_traced_memory()
do_something()
after, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Delta: {(after-before)/1024:.1f} KB, Peak: {peak/1024:.1f} KB")memory_profiler
memory_profiler stellt eine zeilenweise Aufschlüsselung der Speichernutzung bereit, ähnlich wie line_profiler für die CPU.
# pip install memory_profiler
from memory_profiler import profile
@profile
def build_data():
data = [i**2 for i in range(100_000)]
filtered = [x for x in data if x % 2 == 0]
return filtered
build_data()
# python -m memory_profiler script.pymemray
memray (von Bloomberg) ist ein schneller Python-Speicherprofiler mit Flamegraph-Ausgabe.
# pip install memray
# python -m memray run script.py
# python -m memray flamegraph memray-script.py.bin
# Generates an interactive HTML flamegraph
# showing allocations by call stackSpeichernutzung reduzieren
Häufige Techniken sind: Generatoren statt Listen verwenden, __slots__ einsetzen, das array-Modul für numerische Daten nutzen und vermeiden, große Objekte in Closures am Leben zu halten.
# Instead of:
data = [process(x) for x in huge_list] # all in memory
# Use a generator:
def gen_data(lst):
for x in lst:
yield process(x)
for item in gen_data(huge_list):
consume(item) # one at a timesys.getsizeof()
sys.getsizeof(obj) gibt den von einem Objekt belegten Speicher in Byte zurück (oberflächlich – referenzierte Objekte werden nicht einbezogen).
import sys
print(sys.getsizeof([])) # 56
print(sys.getsizeof([1,2,3])) # 88
print(sys.getsizeof("hello")) # 54
print(sys.getsizeof({})) # 64
# For deep size, use recursive measurement:
def deep_size(obj):
return sys.getsizeof(obj) + sum(
sys.getsizeof(v) for v in vars(obj).values()
if hasattr(obj, "__dict__")
)Profiling in der Produktion
Führen Sie tracemalloc in der Produktion mit einer begrenzten Anzahl von nframes aus, um den Overhead zu minimieren. Speichern Sie Snapshots für die Offline-Analyse in einer Datei.
import tracemalloc, pickle
tracemalloc.start(nframe=5) # low overhead
# ... serve some requests ...
snap = tracemalloc.take_snapshot()
with open("snap.pkl","wb") as f:
pickle.dump(snap, f)
# Analyse later offlineKurzer Test
Wofür stehen die beiden von tracemalloc.get_traced_memory() zurückgegebenen Werte?
Zusammenfassung
Verwenden Sie tracemalloc.start() und Snapshots, um Speicherlecks zu finden. Vergleichen Sie Snapshots mit compare_to(). Verwenden Sie memory_profiler für die zeilenweise Speichernutzung und memray für Flamegraphs. Reduzieren Sie den Speicherverbrauch mit Generatoren, __slots__ und NumPy-Arrays.
Häufig gestellte Fragen
Ist die Lektion „Speicherprofiling mit tracemalloc“ kostenlos?
Ja — der vollständige Text von „Speicherprofiling mit tracemalloc“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Speicherprofiling mit tracemalloc“?
Verfolgen Sie Speicherzuweisungen und finden Sie Lecks mit tracemalloc. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Python Academy zu starten?
Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Speicherprofiling mit tracemalloc“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?
Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Referenzzählung in CPython
- Der Garbage Collector und zyklische Referenzen
- Profiling mit cProfile und line_profiler
- Speicherprofiling mit tracemalloc