Python Academy · Pelajaran

Pemprofilan dengan cProfile dan line_profiler

Cari bahagian penggunaan CPU yang tinggi dengan cProfile dan pemprofilan baris demi baris.

Pelajaran 3 daripada 413 langkah

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 functions

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

CLI 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 first

Mengelakkan 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 loop

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

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

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

  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