Profilazione della memoria con tracemalloc
Tracci le allocazioni di memoria e individui le perdite con tracemalloc.
Profilazione della memoria con tracemalloc è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.
Che cos'è tracemalloc?
tracemalloc è un modulo della libreria standard che tiene traccia delle allocazioni di memoria Python in base al file e al numero di riga.
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")Acquisizione di snapshot
Uno snapshot acquisisce tutte le allocazioni correnti in un determinato momento. Confronti due snapshot per trovare ciò che è stato allocato tra l'uno e l'altro.
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)Filtraggio degli snapshot
Filtri le statistiche per visualizzare solo il codice della propria applicazione, escludendo la libreria standard.
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)Principali allocazioni
Utilizzi snapshot.statistics("lineno") o "traceback" per visualizzare i principali consumatori di memoria per riga o per traceback completo.
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)Individuazione delle perdite di memoria
Acquisisca due snapshot prima e dopo una potenziale perdita, quindi li confronti. Statistiche in crescita tra i due snapshot indicano una perdita.
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() restituisce i byte (current, peak): è utile per controlli leggeri prima e dopo.
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 fornisce l'utilizzo della memoria riga per riga, in modo simile a line_profiler per la 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 (di Bloomberg) è un profiler della memoria Python veloce, con output sotto forma di flamegraph.
# 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 stackRiduzione dell'uso della memoria
Tecniche comuni: utilizzi generatori invece di liste, __slots__, il modulo array per i dati numerici e gli array numpy; eviti inoltre di mantenere in vita oggetti di grandi dimensioni nelle closure.
# 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) restituisce la memoria utilizzata da un oggetto in byte (in modo superficiale: non include gli oggetti referenziati).
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 produzione
Esegua tracemalloc in produzione con un numero limitato di nframes per ridurre al minimo l'overhead. Salvi gli snapshot in un file per analizzarli offline.
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 offlineVerifica rapida
Che cosa rappresentano i due valori restituiti da tracemalloc.get_traced_memory()?
Riepilogo
Utilizzi tracemalloc.start() e gli snapshot per trovare le perdite di memoria. Confronti gli snapshot con compare_to(). Utilizzi memory_profiler per l'utilizzo riga per riga e memray per i flamegraph. Riduca l'uso della memoria con generatori, __slots__ e array NumPy.
Domande Frequenti
La lezione «Profilazione della memoria con tracemalloc» è gratuita?
Sì — il testo completo di «Profilazione della memoria con tracemalloc» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.
Cosa imparerò in «Profilazione della memoria con tracemalloc»?
Tracci le allocazioni di memoria e individui le perdite con tracemalloc. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Python Academy?
Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Profilazione della memoria con tracemalloc»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Python Academy?
Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Conteggio dei riferimenti in CPython
- Garbage collector e riferimenti ciclici
- Profilazione con cProfile e line_profiler
- Profilazione della memoria con tracemalloc