Hukommelsesprofilering med tracemalloc
Spor hukommelsesallokeringer, og find lækager med tracemalloc.
Hukommelsesprofilering med tracemalloc er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad er tracemalloc?
tracemalloc er et modul i standardbiblioteket, der sporer Python-hukommelsesallokeringer efter fil og linjenummer.
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")Oprettelse af øjebliksbilleder
Et øjebliksbillede registrerer alle aktuelle allokeringer på et bestemt tidspunkt. Sammenlign to øjebliksbilleder for at finde ud af, hvad der blev allokeret imellem dem.
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)Filtrering af øjebliksbilleder
Filtrér statistikkerne, så de kun viser din applikations kode og udelukker standardbiblioteket.
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)Største allokeringer
Brug snapshot.statistics("lineno") eller "traceback" for at se de største hukommelsesforbrugere efter linje eller med et fuldt stack trace.
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)Sådan finder du hukommelseslækager
Tag to øjebliksbilleder omkring en mistænkt lækage, og sammenlign dem. Voksende statistikker mellem øjebliksbillederne tyder på en lækage.
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() returnerer (current, peak) bytes — nyttigt til enkle før-og-efter-kontroller.
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 viser hukommelsesforbruget linje for linje, på samme måde som line_profiler gør for CPU-forbruget.
# 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 (fra Bloomberg) er en hurtig Python-profiler til hukommelse med output i form af flammegrafer.
# 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 stackReduktion af hukommelsesforbruget
Almindelige teknikker er at bruge generatorer i stedet for lister, __slots__, array-modulet til numeriske data og at undgå at holde store objekter i live i lukninger.
# 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) returnerer den hukommelse, et objekt bruger, i bytes (overfladisk — refererede objekter medregnes ikke).
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__")
)Profilering i produktion
Kør tracemalloc med et begrænset antal nframes i produktion for at minimere belastningen. Gem øjebliksbillederne i en fil til offlineanalyse.
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 offlineHurtigt tjek
Hvad repræsenterer de to værdier, som tracemalloc.get_traced_memory() returnerer?
Opsamling
Brug tracemalloc.start() sammen med øjebliksbilleder til at finde hukommelseslækager. Sammenlign øjebliksbilleder med compare_to(). Brug memory_profiler til forbrug linje for linje og memray til flammegrafer. Reducér hukommelsesforbruget med generatorer, __slots__ og NumPy-arrays.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “Hukommelsesprofilering med tracemalloc” gratis?
Ja — hele teksten til “Hukommelsesprofilering med tracemalloc” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Hukommelsesprofilering med tracemalloc”?
Spor hukommelsesallokeringer, og find lækager med tracemalloc. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Hukommelsesprofilering med tracemalloc”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- CPython-referenceoptælling
- Garbage collectoren og cykliske referencer
- Profilering med cProfile og line_profiler
- Hukommelsesprofilering med tracemalloc