Python Academy · leksjon

Profilering med cProfile og line_profiler

Finn CPU-flaskehalser med cProfile og profilering linje for linje.

Leksjon 3 av 413 trinn

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 functions

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

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

Unngå 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 loop

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

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

Gratis å komme i gang

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

  1. Referansetelling i CPython
  2. Garbage collector og sykliske referanser
  3. Profilering med cProfile og line_profiler
  4. Minneprofilering med tracemalloc
← Tilbake til Python Academy