Sto usando cProfile per profilare il mio codice e funziona alla grande. Uso anche gprof2dot.py per visualizzare i risultati (lo rende un po 'più chiaro).
Tuttavia, cProfile (e la maggior parte degli altri profiler Python che ho visto finora) sembrano profilare solo a livello di chiamata di funzione. Ciò causa confusione quando determinate funzioni vengono chiamate da luoghi diversi: non ho idea se la chiamata # 1 o la chiamata # 2 stia occupando la maggior parte del tempo. La situazione peggiora ulteriormente quando la funzione in questione è profonda sei livelli, richiamata da altri sette punti.
Come si ottiene una profilazione riga per riga?
Invece di questo:
function #12, total time: 2.0s
Mi piacerebbe vedere qualcosa di simile:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile mostra quanto del tempo totale si "trasferisce" al genitore, ma ancora una volta questa connessione viene persa quando si hanno un mucchio di livelli e chiamate interconnesse.
Idealmente, mi piacerebbe avere una GUI che analizzi i dati, quindi mi mostri il mio file sorgente con un tempo totale assegnato a ciascuna riga. Qualcosa come questo:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Quindi sarei in grado di fare clic sulla seconda chiamata "func (c)" per vedere cosa sta richiedendo tempo in quella chiamata, separatamente dalla chiamata "func (a)".
Ha senso? Esiste una libreria di profili che raccolga questo tipo di informazioni? C'è qualche strumento fantastico che mi sono perso?
pstats.print_callers
. Un esempio è qui .