Profilen met cProfile en line_profiler
Vind CPU-knelpunten met cProfile en profilering per regel.
Profilen met cProfile en line_profiler is een gratis Python Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.
Waarom profileren?
Profileren laat zien welke functies de meeste tijd kosten en helpt bij het bepalen van optimalisaties. Profileer altijd voordat je optimaliseert — gok nooit.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")cProfile uitvoeren vanaf de opdrachtregel
Profileer een volledig script zonder het aan te passen: python -m cProfile -s cumtime script.py. Sorteer op cumtime, tottime of 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 in code
Maak een cProfile.Profile, schakel het in en uit en druk daarna de statistieken af met 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())Filteren met pstats
Filter de uitvoer van de profiler op een specifieke module of een patroon voor functienamen met 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 toont de uitvoeringstijd per regel, niet alleen per functie — essentieel om de knelpuntregel binnen een functie te vinden.
# 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 voert het script uit met ingeschakelde regelprofilering; -v toont het rapport direct.
# 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)Profileren in Jupyter
Jupyter biedt de magische opdrachten %prun (cProfile) en %lprun (line_profiler).
# In a Jupyter cell:
# %prun -s cumulative my_function(data)
# %load_ext line_profiler
# %lprun -f my_function my_function(data)Prestatieknelpunten identificeren
Richt je op de functies met de hoogste cumulatieve tijd (de volledige aanroepketen) en de hoogste totale tijd (de functie zelf, zonder aangeroepen functies).
# cumtime = total time including callees (find root cause)
# tottime = time in function itself (find where work happens)
#
# Optimise the function with highest tottime firstVoortijdige optimalisatie vermijden
Profileer eerst en optimaliseer daarna het gemeten knelpunt. Veelgebruikte versnellingen in Python zijn ingebouwde functies gebruiken, lussen naar NumPy verplaatsen, herhaalde zoekacties cachen of C aanroepen 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 op basis van steekproeven
py-spy profileert actieve processen zonder de code aan te passen — koppel het aan een actief proces met een 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 30Prestaties meten met timeit
Gebruik timeit voor microbenchmarks van specifieke expressies.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Snelle controle
Wat toont tottime in een cProfile-rapport?
Samenvatting
Gebruik cProfile om trage functies te vinden en line_profiler om de trage regel te vinden. Profileer met -s cumtime om de onderliggende oorzaken te vinden. Optimaliseer alleen bewezen knelpunten — gebruik vectorisatie met NumPy, caching of C-extensies voor de grootste verbeteringen.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 76
- Lessen
- 320
Veelgestelde vragen
Is de les “Profilen met cProfile en line_profiler” gratis?
Ja — de volledige tekst van “Profilen met cProfile en line_profiler” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.
Wat leer ik in “Profilen met cProfile en line_profiler”?
Vind CPU-knelpunten met cProfile en profilering per regel. Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Python Academy te beginnen?
Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Profilen met cProfile en line_profiler”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Python Academy?
Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Reference counting in CPython
- De garbagecollector en cyclische referenties
- Profilen met cProfile en line_profiler
- Geheugenprofilering met tracemalloc