Pembuatan Profil dengan cProfile dan line_profiler
Temukan titik panas CPU dengan cProfile dan pembuatan profil baris demi baris.
Pembuatan Profil dengan cProfile dan line_profiler adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Mengapa Membuat Profil?
Pembuatan profil mengidentifikasi fungsi yang menghabiskan waktu paling banyak dan mengarahkan upaya pengoptimalan. Selalu lakukan pembuatan profil sebelum mengoptimalkan—jangan pernah menebak.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")Menjalankan cProfile dari CLI
Profile seluruh skrip tanpa mengubahnya: python -m cProfile -s cumtime script.py. Urutkan berdasarkan cumtime, tottime, atau calls.
# python -m cProfile -s cumtime my_script.py
#
# ncalls tottime percall cumtime percall filename:lineno(function)
# 1000 0.500 0.001 2.100 0.002 utils.py:10(process)cProfile dalam Kode
Buat cProfile.Profile, aktifkan/nonaktifkan dengan enable/disable, lalu cetak statistik dengan pstats.
import cProfile, pstats, io
pr = cProfile.Profile()
pr.enable()
# ... code to profile ...
pr.disable()
stream = io.StringIO()
ps = pstats.Stats(pr, stream=stream).sort_stats("cumulative")
ps.print_stats(10) # top 10
print(stream.getvalue())Pemfilteran pstats
Filter keluaran profiler agar hanya mencakup modul tertentu atau pola nama fungsi tertentu menggunakan print_stats(pattern).
import cProfile, pstats
cProfile.run("my_function()", "profile.out")
stats = pstats.Stats("profile.out")
stats.sort_stats("tottime")
stats.print_stats("mymodule") # only mymodule functionsline_profiler
line_profiler menampilkan waktu eksekusi untuk setiap baris, bukan hanya setiap fungsi—hal ini penting untuk menemukan baris yang paling lambat di dalam suatu fungsi.
# pip install line_profiler
# Decorate target function:
from line_profiler import profile
@profile
def process(data):
result = []
for item in data: # <- which line is slow?
result.append(item*2)
return result
# Run: kernprof -l -v script.pyCLI kernprof
kernprof -l script.py menjalankan skrip dengan pembuatan profil per baris yang diaktifkan; -v langsung menampilkan laporannya.
# kernprof -l -v script.py
#
# Line # Hits Time Per Hit % Time Line Contents
# ======================================================
# 4 1 2.0 2.0 1.0 result = []
# 5 1000 120.0 0.1 60.0 for item in data:
# 6 1000 80.0 0.1 39.0 result.append(item*2)Pembuatan Profil di Jupyter
Jupyter menyediakan perintah ajaib %prun (cProfile) dan %lprun (line_profiler).
# In a Jupyter cell:
# %prun -s cumulative my_function(data)
# %load_ext line_profiler
# %lprun -f my_function my_function(data)Mengidentifikasi Bagian Paling Lambat
Fokuslah pada fungsi dengan waktu kumulatif tertinggi (seluruh rantai pemanggilan) dan waktu total tertinggi (fungsi itu sendiri, tidak termasuk fungsi yang dipanggilnya).
# cumtime = total time including callees (find root cause)
# tottime = time in function itself (find where work happens)
#
# Optimise the function with highest tottime firstMenghindari Optimasi Dini
Buat profil terlebih dahulu, lalu optimalkan hambatan yang terukur. Peningkatan kecepatan Python yang umum meliputi penggunaan fungsi bawaan, memindahkan perulangan ke NumPy, menyimpan hasil pencarian berulang dalam cache, atau memanggil C melalui ctypes/cffi.
# Before optimising:
# profile shows: process_row() 95% of time
# Speedup: vectorise with NumPy
import numpy as np
arr = np.array(data)
result = arr * 2 # 100x faster than Python looppy-spy: Profiler Pengambilan Sampel
py-spy membuat profil proses yang sedang berjalan tanpa mengubah kode—hubungkan ke PID yang aktif.
# pip install py-spy
# Profile for 30 s and show flamegraph:
# py-spy top --pid 12345
# py-spy record -o profile.svg --pid 12345 --duration 30Pembandingan dengan timeit
Gunakan timeit untuk melakukan pembandingan mikro pada ekspresi tertentu.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Pemeriksaan Cepat
Apa yang ditampilkan oleh tottime dalam laporan cProfile?
Ringkasan
Gunakan cProfile untuk menemukan fungsi yang lambat dan line_profiler untuk menemukan baris yang lambat. Buat profil dengan -s cumtime untuk menemukan akar masalah. Optimalkan hanya bagian paling lambat yang sudah terbukti—gunakan vektorisasi NumPy, caching, atau ekstensi C untuk mendapatkan peningkatan terbesar.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pembuatan Profil dengan cProfile dan line_profiler” gratis?
Ya — teks lengkap “Pembuatan Profil dengan cProfile dan line_profiler” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pembuatan Profil dengan cProfile dan line_profiler”?
Temukan titik panas CPU dengan cProfile dan pembuatan profil baris demi baris. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pembuatan Profil dengan cProfile dan line_profiler” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Penghitungan Referensi CPython
- Pengumpul Sampah dan Referensi Siklik
- Pembuatan Profil dengan cProfile dan line_profiler
- Pembuatan Profil Memori dengan tracemalloc