0Pricing
Python Academy · Lekcja

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

memray

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 stack

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

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

Szybkie 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

  1. Zliczanie odwołań w CPythonie
  2. Garbage collector i cykliczne odwołania
  3. Profilowanie za pomocą cProfile i line_profiler
  4. Profilowanie pamięci za pomocą tracemalloc
← Powrót do Python Academy