Pemprofilan dengan cProfile dan line_profiler
Cari bahagian penggunaan CPU yang tinggi dengan cProfile dan pemprofilan baris demi baris.
Pemprofilan dengan cProfile dan line_profiler ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 3 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.
Mengapa Membuat Profil?
Pemprofilan mengenal pasti fungsi yang menggunakan paling banyak masa dan membimbing usaha pengoptimuman. Sentiasa buat profil sebelum mengoptimumkan — jangan sekali-kali meneka.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")Menjalankan cProfile daripada CLI
Buat pemprofilan seluruh skrip tanpa mengubahnya: python -m cProfile -s cumtime script.py. Isih mengikut 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 Kod
Cipta cProfile.Profile, dayakan atau nyahdayakannya, kemudian 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())Penapisan pstats
Tapis output pemprofil kepada modul tertentu atau corak nama fungsi 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 memaparkan masa pelaksanaan bagi setiap baris, bukan hanya bagi setiap fungsi — penting untuk mencari baris kritikal dalam sesuatu 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 pemprofilan baris didayakan; -v memaparkan laporan dengan serta-merta.
# 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)Pemprofilan dalam Jupyter
Jupyter menyediakan arahan magik %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)Mengenal Pasti Titik Panas
Tumpukan perhatian pada fungsi dengan masa kumulatif tertinggi (keseluruhan rantaian) dan masa jumlah 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 firstMengelakkan Pengoptimuman Pramatang
Buat pemprofilan dahulu, kemudian optimumkan kesesakan yang diukur. Peningkatan kelajuan Python yang biasa termasuk menggunakan fungsi terbina dalam, memindahkan gelung ke NumPy, menyimpan hasil carian 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: Pemprofil Pensampelan
py-spy membuat pemprofilan proses yang sedang berjalan tanpa mengubah kod — lampirkan pada 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 30Penanda Aras dengan timeit
Gunakan timeit untuk penanda aras mikro bagi ungkapan tertentu.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Semakan Pantas
Apakah yang ditunjukkan oleh tottime dalam laporan cProfile?
Rumusan
Gunakan cProfile untuk mencari fungsi yang perlahan dan line_profiler untuk mencari baris yang perlahan. Buat pemprofilan dengan -s cumtime untuk mencari punca utama. Optimumkan hanya titik panas yang telah dibuktikan — gunakan vektorisasi NumPy, cache atau sambungan C untuk peningkatan terbesar.
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 dengan cProfile dan line_profiler” percuma?
Ya — teks penuh “Pemprofilan dengan cProfile dan line_profiler” 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 dengan cProfile dan line_profiler”?
Cari bahagian penggunaan CPU yang tinggi dengan cProfile dan pemprofilan baris demi baris. 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 3 daripada 4.
Berapa lamakah pelajaran “Pemprofilan dengan cProfile dan line_profiler” 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
- Pengiraan Rujukan CPython
- Pengutip Sampah dan Rujukan Bersiklus
- Pemprofilan dengan cProfile dan line_profiler
- Pemprofilan Memori dengan tracemalloc