Python Academy · Lektion

Profilering med cProfile og line_profiler

Find CPU-flaskehalse med cProfile og profilering linje for linje.

Lektion 3 af 413 trin

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 functions

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

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

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

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

Ydelsesmå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.

Gratis at komme i gang

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

  1. CPython-referenceoptælling
  2. Garbage collectoren og cykliske referencer
  3. Profilering med cProfile og line_profiler
  4. Hukommelsesprofilering med tracemalloc
← Tilbage til Python Academy