Profilazione con cProfile e line_profiler
Individui i colli di bottiglia della CPU con cProfile e la profilazione riga per riga.
Profilazione con cProfile e line_profiler è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.
Perché eseguire il profiling?
Il profiling identifica le funzioni che consumano più tempo e orienta le attività di ottimizzazione. Esegua sempre il profiling prima di ottimizzare: non proceda mai per supposizioni.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")Esecuzione di cProfile dalla CLI
Profili un intero script senza modificarlo: python -m cProfile -s cumtime script.py. Ordina per cumtime, tottime o 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 nel codice
Crei un oggetto cProfile.Profile, lo abiliti e disabiliti, quindi stampi le statistiche con 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())Filtraggio con pstats
Filtri l'output del profiler in base a un modulo specifico o a un modello per il nome della funzione usando 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 mostra il tempo di esecuzione per ogni riga, non solo per ogni funzione: è essenziale per trovare la riga critica all'interno di una funzione.
# 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.pyCLI di kernprof
kernprof -l script.py esegue lo script con il line profiling attivato; -v visualizza immediatamente il report.
# 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)Profiling in Jupyter
Jupyter fornisce i comandi magici %prun (cProfile) e %lprun (line_profiler).
# In a Jupyter cell:
# %prun -s cumulative my_function(data)
# %load_ext line_profiler
# %lprun -f my_function my_function(data)Identificazione dei punti critici
Si concentri sulle funzioni con il tempo cumulativo più alto (l'intera catena) e con il tempo totale più alto (la funzione stessa, escluse quelle chiamate).
# cumtime = total time including callees (find root cause)
# tottime = time in function itself (find where work happens)
#
# Optimise the function with highest tottime firstEvitare l'ottimizzazione prematura
Profili prima, quindi ottimizzi il collo di bottiglia misurato. Accelerazioni comuni in Python: utilizzi le funzioni integrate, sposti i cicli in NumPy, memorizzi nella cache le ricerche ripetute oppure chiami C tramite 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 a campionamento
py-spy profila i processi in esecuzione senza modificare il codice: si colleghi a un PID attivo.
# 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 30Benchmarking con timeit
Utilizzi timeit per eseguire micro-benchmark di espressioni specifiche.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Verifica rapida
Che cosa mostra tottime in un report di cProfile?
Riepilogo
Utilizzi cProfile per trovare le funzioni lente e line_profiler per trovare la riga lenta. Esegua il profiling con -s cumtime per individuare le cause principali. Ottimizzi solo i punti critici verificati: utilizzi la vettorializzazione di NumPy, la memorizzazione nella cache o estensioni C per ottenere i miglioramenti più significativi.
Domande Frequenti
La lezione «Profilazione con cProfile e line_profiler» è gratuita?
Sì — il testo completo di «Profilazione con cProfile e line_profiler» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.
Cosa imparerò in «Profilazione con cProfile e line_profiler»?
Individui i colli di bottiglia della CPU con cProfile e la profilazione riga per riga. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Python Academy?
Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Profilazione con cProfile e line_profiler»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Python Academy?
Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Conteggio dei riferimenti in CPython
- Garbage collector e riferimenti ciclici
- Profilazione con cProfile e line_profiler
- Profilazione della memoria con tracemalloc