2009-09-30 14 views
5

Sto usando cProfile, pstats e Gprof2dot per profilare uno script python piuttosto lungo.cProfile e Python: trovare il numero di riga specifico che il codice trascorre più tempo su

I risultati indicano che si impiegano più tempo per chiamare un metodo in un oggetto che ho definito. Tuttavia, quello che mi piacerebbe davvero è sapere esattamente quale numero di linea all'interno di quella funzione sta mangiando il tempo.

Qualche idea è come ottenere queste informazioni aggiuntive?

(A proposito, sto usando Python 2.6 su OSX Snow Leopard se questo aiuta ...)

risposta

1

Supponiamo che la quantità di tempo di essere "mangiato" è un numero, come il 40%. Quindi se interrompi il programma o lo interrompi in un momento casuale, la probabilità è del 40% che lo vedrai, esposto in modo preciso nello stack delle chiamate. Fatelo 10 volte e su 4 campioni, +/-, lo vedrete.

This tells why it works.This is an example.

2

cProfile non tiene numeri di riga all'interno di una funzione; traccia solo il numero di riga di dove è stata definita la funzione.

cProfile tentativi di duplicare il comportamento di profile (che è puro Python). profile utilizza pstats per memorizzare i dati dall'esecuzione e pstats memorizza solo i numeri di riga per le definizioni di funzione, non per le singole istruzioni Python.

Se è necessario capire con granularità più fine ciò che sta mangiando tutto il tuo tempo, allora devi ridimensionare la tua grande funzione in diverse funzioni più piccole.

+0

refactoring in piccole funzioni non è sempre possibile - e le chiamate di funzione sono costose in Python, questo può influenzare la velocità in modo significativo. –

+0

+1: rompere in parti più piccole è il modo più semplice. Inoltre è possibile racchiudere alcuni blocchi in funzioni temporali definite localmente (per la creazione di profili). Ciò consentirà anche chiamate contabili separate per la stessa funzione da luoghi diversi. –

3

C'è un line profiler in pitone scritto da Robert Kern.

+0

Questo sembra quello che sto cercando ... tuttavia, non riesco a installare su OSX Snow Leopard, dal momento che sta cercando l'SDK 10.4 (che non è lì sul 10.6). Impossibile trovare il riferimento nello script di build per modificare questo ... Se aiuta l'esatto messaggio di errore che ottengo quando si utilizza "sudo python setup.py install" è: Compilare con un SDK che non sembra esistono: /Developer/SDKs/MacOSX10.4u.sdk –

+0

Non ho questo problema sul mio macbook (anche su snow leopard). Vi sconsigliamo di usare sudo per l'installazione, che è spesso una cattiva idea (potrebbe violare il vostro python di sistema, e sudo non esporta le vostre variabili env come ci si aspetterebbe). Ti consiglierei di portare questo problema sulla mailing list enthought-dev –

Problemi correlati