Python Academy · Lektion

Hukommelsesprofilering med tracemalloc

Spor hukommelsesallokeringer, og find lækager med tracemalloc.

Lektion 4 af 413 trin

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.py

memray

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 stack

Reduktion 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 time

sys.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 offline

Hurtigt 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.

Gratis at komme i gang

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

  1. CPython-referenceoptælling
  2. Garbage collectoren og cykliske referencer
  3. Profilering med cProfile og line_profiler
  4. Hukommelsesprofilering med tracemalloc
← Tilbage til Python Academy