Profilering med cProfile og line_profiler
Finn CPU-flaskehalser med cProfile og profilering linje for linje.
Profilering med cProfile og line_profiler er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hvorfor profilere?
Profilering identifiserer hvilke funksjoner som bruker mest tid, og gir retning for optimaliseringsarbeidet. Profiler alltid før De optimaliserer – gjett aldri.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")Kjøre cProfile fra CLI
Profiler et helt skript uten å endre det: python -m cProfile -s cumtime script.py. Sorter etter cumtime, tottime eller 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 i kode
Opprett en cProfile.Profile, aktiver og deaktiver den, og skriv deretter ut statistikk med 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())Filtrering med pstats
Filtrer profileringsresultatet slik at det bare viser et bestemt modul- eller funksjonsnavnmønster, ved hjelp av 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 viser kjøretiden per linje, ikke bare per funksjon – noe som er nødvendig for å finne den mest belastede linjen i en funksjon.
# 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.pykernprof CLI
kernprof -l script.py kjører skriptet med linjeprofilering aktivert. -v viser rapporten umiddelbart.
# 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)Profilering i Jupyter
Jupyter har magiske kommandoer som %prun (cProfile) og %lprun (line_profiler).
# In a Jupyter cell:
# %prun -s cumulative my_function(data)
# %load_ext line_profiler
# %lprun -f my_function my_function(data)Finne flaskehalser
Fokuser på funksjonene med høyest kumulativ tid (hele kjeden) og høyest total tid (selve funksjonen, uten kalte funksjoner).
# cumtime = total time including callees (find root cause)
# tottime = time in function itself (find where work happens)
#
# Optimise the function with highest tottime firstUnngå for tidlig optimalisering
Profiler først, og optimaliser deretter den målte flaskehalsen. Vanlige hastighetsforbedringer i Python er å bruke innebygde funksjoner, flytte løkker til NumPy, hurtigbufre gjentatte oppslag eller kalle C via 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: samplingsprofiler
py-spy profilerer prosesser som kjører, uten å endre koden – koble den til en aktiv PID.
# 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 30Benchmarking med timeit
Bruk timeit til mikromålinger av bestemte uttrykk.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Hurtigsjekk
Hva viser tottime i en cProfile-rapport?
Oppsummering
Bruk cProfile til å finne trege funksjoner og line_profiler til å finne den trege linjen. Profiler med -s cumtime for å finne rotårsakene. Optimaliser bare dokumenterte flaskehalser – bruk NumPy-vektorisering, hurtigbufring eller C-utvidelser for de største gevinstene.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 76
- Leksjoner
- 320
Ofte stilte spørsmål
Er leksjonen «Profilering med cProfile og line_profiler» gratis?
Ja – hele teksten i «Profilering med cProfile og line_profiler» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Profilering med cProfile og line_profiler»?
Finn CPU-flaskehalser med cProfile og profilering linje for linje. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Python Academy?
Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Profilering med cProfile og line_profiler»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?
Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Referansetelling i CPython
- Garbage collector og sykliske referanser
- Profilering med cProfile og line_profiler
- Minneprofilering med tracemalloc