Profilowanie pamięci za pomocą tracemalloc
Proszę śledzić alokacje pamięci i znajdować wycieki za pomocą tracemalloc.
Profilowanie pamięci za pomocą tracemalloc to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Czym jest tracemalloc?
tracemalloc to moduł biblioteki standardowej, który śledzi alokacje pamięci w Pythonie według pliku i numeru wiersza.
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")Tworzenie migawek
Migawka rejestruje wszystkie bieżące alokacje w określonym momencie. Porównanie dwóch migawek pozwala znaleźć to, co zostało zaalokowane między nimi.
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)Filtrowanie migawek
Statystyki można filtrować tak, aby wyświetlały wyłącznie kod aplikacji, z pominięciem biblioteki standardowej.
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)Najwięksi użytkownicy pamięci
Za pomocą snapshot.statistics("lineno") lub "traceback" można wyświetlić największych użytkowników pamięci według wiersza albo pełnego śladu stosu.
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)Znajdowanie wycieków pamięci
Należy wykonać dwie migawki przed podejrzanym wyciekiem i po nim, a następnie je porównać. Rosnące statystyki między migawkami wskazują na wyciek.
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() zwraca liczbę bajtów w postaci (current, peak) — jest to przydatne przy lekkich porównaniach stanu przed i po.
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 udostępnia informacje o użyciu pamięci w każdym wierszu, podobnie jak line_profiler w przypadku procesora.
# 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 (firmy Bloomberg) to szybki profiler pamięci w Pythonie z możliwością generowania wykresów płomieniowych.
# 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 stackZmniejszanie użycia pamięci
Typowe techniki to używanie generatorów zamiast list, __slots__, modułu array dla danych liczbowych, tablic numpy oraz unikanie utrzymywania dużych obiektów przy życiu w domknięciach.
# 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) zwraca rozmiar pamięci zajmowanej przez obiekt w bajtach (płytko — bez obiektów, do których się odwołuje).
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__")
)Profilowanie w środowisku produkcyjnym
W środowisku produkcyjnym należy uruchamiać tracemalloc z ograniczoną wartością nframes, aby zminimalizować narzut. Migawki można zapisywać w pliku do późniejszej analizy 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 offlineSzybkie sprawdzenie
Co oznaczają dwie wartości zwracane przez tracemalloc.get_traced_memory()?
Podsumowanie
Należy używać tracemalloc.start() oraz migawek do znajdowania wycieków pamięci. Migawki można porównywać za pomocą compare_to(). memory_profiler służy do analizy użycia pamięci w poszczególnych wierszach, a memray do tworzenia wykresów płomieniowych. Zużycie pamięci można zmniejszyć za pomocą generatorów, __slots__ i tablic NumPy.
Często zadawane pytania
Czy lekcja „Profilowanie pamięci za pomocą tracemalloc” jest bezpłatna?
Tak — pełny tekst „Profilowanie pamięci za pomocą tracemalloc” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Profilowanie pamięci za pomocą tracemalloc”?
Proszę śledzić alokacje pamięci i znajdować wycieki za pomocą tracemalloc. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Profilowanie pamięci za pomocą tracemalloc”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Zliczanie odwołań w CPythonie
- Garbage collector i cykliczne odwołania
- Profilowanie za pomocą cProfile i line_profiler
- Profilowanie pamięci za pomocą tracemalloc