Python Academy · Pelajaran

Pemprofilan Memori dengan tracemalloc

Jejaki peruntukan memori dan cari kebocoran dengan tracemalloc.

Pelajaran 4 daripada 413 langkah

Pemprofilan Memori dengan tracemalloc ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah tracemalloc?

tracemalloc ialah modul pustaka standard yang menjejak peruntukan memori Python mengikut fail dan nombor baris.

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")

Mengambil Petikan

Petikan merekodkan semua peruntukan semasa pada satu titik masa. Bandingkan dua petikan untuk mencari perkara yang diperuntukkan antara kedua-duanya.

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)

Menapis Petikan

Tapis statistik supaya hanya kod aplikasi anda dipaparkan, tanpa menyertakan pustaka 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)

Peruntuk Teratas

Gunakan snapshot.statistics("lineno") atau "traceback" untuk melihat pengguna memori teratas mengikut baris atau jejak panggilan penuh.

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)

Mencari Kebocoran Memori

Ambil dua petikan di sekitar kebocoran yang disyaki dan bandingkannya. Statistik yang meningkat antara petikan menunjukkan adanya kebocoran.

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() mengembalikan bait (current, peak) — berguna untuk semakan ringkas sebelum dan selepas.

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 menyediakan penggunaan memori baris demi baris, serupa dengan line_profiler untuk 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.py

memray

memray (oleh Bloomberg) ialah pemprofil memori Python yang pantas dengan output graf api.

# 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

Mengurangkan Penggunaan Memori

Teknik yang biasa digunakan termasuk menggunakan penjana berbanding senarai, __slots__, modul array untuk data berangka, tatasusunan numpy dan mengelakkan objek besar terus hidup dalam penutupan.

# 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) mengembalikan memori yang digunakan oleh sesuatu objek dalam bait (cetek — tidak termasuk objek yang dirujuk).

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__")
    )

Pemprofilan dalam Produksi

Jalankan tracemalloc dengan nframes yang terhad dalam persekitaran produksi untuk meminimumkan overhed. Simpan petikan ke fail untuk analisis luar talian.

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

Semakan Pantas

Apakah yang diwakili oleh dua nilai yang dikembalikan oleh tracemalloc.get_traced_memory()?

Rumusan

Gunakan tracemalloc.start() bersama petikan untuk mencari kebocoran memori. Bandingkan petikan dengan compare_to(). Gunakan memory_profiler untuk penggunaan baris demi baris dan memray untuk graf api. Kurangkan penggunaan memori dengan penjana, __slots__ dan tatasusunan NumPy.

Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “Pemprofilan Memori dengan tracemalloc” percuma?

Ya — teks penuh “Pemprofilan Memori dengan tracemalloc” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pemprofilan Memori dengan tracemalloc”?

Jejaki peruntukan memori dan cari kebocoran dengan tracemalloc. Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Pemprofilan Memori dengan tracemalloc” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengiraan Rujukan CPython
  2. Pengutip Sampah dan Rujukan Bersiklus
  3. Pemprofilan dengan cProfile dan line_profiler
  4. Pemprofilan Memori dengan tracemalloc
← Kembali ke Python Academy