0Pricing
Python Academy · Lezione

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 functions

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

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

Evitare 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 loop

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

Benchmarking 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

  1. Conteggio dei riferimenti in CPython
  2. Garbage collector e riferimenti ciclici
  3. Profilazione con cProfile e line_profiler
  4. Profilazione della memoria con tracemalloc
← Torna a Python Academy