Python Academy · Lektion

Profilering med cProfile och line_profiler

Hitta CPU-hotspots med cProfile och rad-för-rad-profilering.

Lektion 3 av 413 steg

Profilering med cProfile och line_profiler är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Varför profilera?

Profilering identifierar vilka funktioner som förbrukar mest tid och vägleder optimeringsarbetet. Profilera alltid före optimering – gissa aldrig.

import cProfile

def slow():
    total = 0
    for i in range(1_000_000):
        total += i
    return total

cProfile.run("slow()")

Köra cProfile från CLI

Profilera ett helt skript utan att ändra det: python -m cProfile -s cumtime script.py. Sortera 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 kod

Skapa en cProfile.Profile, aktivera och inaktivera den och skriv sedan ut statistik 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

Filtrera profilerarens utdata så att endast ett specifikt modul- eller funktionsnamnsmönster visas med 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 visar exekveringstiden per rad, inte bara per funktion – vilket är viktigt för att hitta den mest tidskrävande raden 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ör skriptet med radprofilering aktiverad; -v visar rapporten direkt.

# 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 tillhandahåller magiska kommandon med %prun (cProfile) och %lprun (line_profiler).

# In a Jupyter cell:
# %prun -s cumulative my_function(data)

# %load_ext line_profiler
# %lprun -f my_function my_function(data)

Identifiera flaskhalsar

Fokusera på funktionerna med högst kumulativ tid (hela anropskedjan) och högst total tid (funktionen själv, utan anropade 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

Undvik för tidig optimering

Profilera först och optimera sedan den uppmätta flaskhalsen. Vanliga sätt att snabba upp Python är att använda inbyggda funktioner, flytta loopar till NumPy, cacha upprepade uppslag eller anropa 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: Samplingsprofilerare

py-spy profilerar körande processer utan att ändra koden – anslut till ett aktivt 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

Använd timeit för mikromätningar av specifika uttryck.

import timeit

result = timeit.timeit(
    "[x*2 for x in range(1000)]",
    number=10_000
)
print(f"{result:.3f} s for 10k runs")

Snabbkontroll

Vad visar tottime i en cProfile-rapport?

Sammanfattning

Använd cProfile för att hitta långsamma funktioner och line_profiler för att hitta den långsamma raden. Profilera med -s cumtime för att hitta grundorsakerna. Optimera endast bekräftade flaskhalsar – använd NumPy-vektorisering, cachning eller C-tillägg för störst effekt.

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”Profilering med cProfile och line_profiler” gratis?

Ja – hela texten till ”Profilering med cProfile och line_profiler” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Profilering med cProfile och line_profiler”?

Hitta CPU-hotspots med cProfile och rad-för-rad-profilering. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Profilering med cProfile och line_profiler”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Referensräkning i CPython
  2. Skräpsamlaren och cykliska referenser
  3. Profilering med cProfile och line_profiler
  4. Minnesprofilering med tracemalloc
← Tillbaka till Python Academy