Profilering med cProfile og line_profiler
Find CPU-flaskehalse med cProfile og profilering linje for linje.
Profilering med cProfile og line_profiler er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Hvorfor profilere?
Profilering identificerer, hvilke funktioner der bruger mest tid, og hjælper med at styre optimeringsarbejdet. Profilér altid, før du optimerer – gæt aldrig.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")Kørsel af cProfile fra CLI
Profilér et helt script uden at ændre det: python -m cProfile -s cumtime script.py. Sortér efter 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
Opret en cProfile.Profile, aktivér og deaktivér den, og udskriv derefter statistikker 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
Filtrér profilerens output til et bestemt modul eller et mønster for funktionsnavne ved hjælp af 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 køretiden pr. linje, ikke kun pr. funktion — det er afgørende for at finde den langsomme linje i en funktion.
# 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 kører scriptet med linjeprofilering aktiveret; -v viser rapporten med det samme.
# 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 indeholder magic-kommandoerne %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)Identificering af flaskehalse
Fokusér på funktionerne med den højeste kumulative tid (hele kaldkæden) og den højeste samlede tid (selve funktionen uden kaldte funktioner).
# cumtime = total time including callees (find root cause)
# tottime = time in function itself (find where work happens)
#
# Optimise the function with highest tottime firstUndgå for tidlig optimering
Profilér først, og optimér derefter den målte flaskehals. Almindelige Python-optimeringer er at bruge indbyggede funktioner, flytte løkker til NumPy, cache gentagne opslag eller kalde 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: profiler baseret på stikprøver
py-spy profilerer kørende processer uden at ændre koden — tilslut det 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 30Ydelsesmåling med timeit
Brug timeit til mikrobenchmarks af bestemte udtryk.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Hurtigt tjek
Hvad viser tottime i en cProfile-rapport?
Opsamling
Brug cProfile til at finde langsomme funktioner og line_profiler til at finde den langsomme linje. Profilér med -s cumtime for at finde grundårsagerne. Optimér kun dokumenterede flaskehalse — brug NumPy-vektorisering, caching eller C-udvidelser for de største gevinster.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “Profilering med cProfile og line_profiler” gratis?
Ja — hele teksten til “Profilering med cProfile og line_profiler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Profilering med cProfile og line_profiler”?
Find CPU-flaskehalse med cProfile og profilering linje for linje. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Profilering med cProfile og line_profiler”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- CPython-referenceoptælling
- Garbage collectoren og cykliske referencer
- Profilering med cProfile og line_profiler
- Hukommelsesprofilering med tracemalloc