10.3 Manuale utente istantaneo

Questa sezione esiste per coloro che ``non vogliono leggere il manuale''. Offre una panoramica molto veloce, permettendo ad un utente di eseguire rapidamente il profilo di un'applicazione esistente.

Ad esempio, per analizzare un'applicazione con una funzione principale foo(), dovete aggiungere il codice seguente al vostro modulo:

import profile
profile.run('foo()')

Il frammento di codice precedente causerà l'esecuzione di foo() e la stampa a video di una serie di righe informative (il profilo). Questo approccio è più utile quando si lavora con l'interprete in modalità interattiva. Se si vuole salvare il risultato di un profilo in un file per un esame successivo, si può aggiungere il nome del file come secondo argomento della funzione run():

import profile
profile.run('foo()', 'fooprof')

Il file profile.py può anche venire utilizzato come script per analizzare un altro script. Per esempio:

python /usr/local/lib/python1.5/profile.py myscript.py

profile.py accetta due argomenti facoltativi da riga di comando:

profile.py [-o output_file] [-s sort_order]

-s ha effetto solamente sullo standard output (-o non viene fornito). Vedete la documentazione di Stats per conoscere i valori validi per l'ordinamento.

Quando volete rivedere il profilo, dovrete utilizzare i metodi disponibili nel modulo pstats. Di solito le statistiche vengono caricate così:

import pstats
p = pstats.Stats('fooprof')

La classe Stats (il codice precedente crea solo un'istanza di questa classe) possiede una grande varietà di metodi per la manipolazione e la stampa dei dati che sono stati appena caricati in p. Quando prima avete utilizzato profile.run(), la stampa ottenuta era il risultato della chiamata di tre metodi:

p.strip_dirs().sort_stats(-1).print_stats()

Il primo metodo ha rimosso i percorsi estranei da tutti i nomi dei moduli. Il secondo ha ordinato tutti le voci secondo la stringa standard modulo/riga/nome che è stata stampata (per compatibilità semantica con il vecchio profiler). Il terzo metodo ha stampato tutte le statistiche. Potete provare anche le seguenti funzioni di ordinamento:

p.sort_stats('name')
p.print_stats()

La prima chiamata ordinerà la lista delle voci secondo il nome della funzione e la seconda chiamata stamperà tutte le statistiche. Quelle che segueno sono alcune chiamate interessanti con le quali fare esperimenti:

p.sort_stats('cumulative').print_stats(10)

Questo ordina il profilo secondo il tempo cumulativo in una funzione e poi stampa solo i primi dieci risultati più significativi. Il codice precedente è l'ideale se si vuole conoscere l'algoritmo che sta spendendo più tempo.

Se si vuole sapere quali funzioni stiano effettuando parecchi cicli, consumando molto tempo, dovete fare così:

p.sort_stats('time').print_stats(10)

per ordinare secondo il tempo speso dentro ogni funzione e stampando le statistiche delle prime dieci funzioni.

Provate anche questo:

p.sort_stats('file').print_stats('__init__')

Questa funzione ordinerà le statistiche per nome di file, e poi stamperà le statistiche relative solo ai metodi di inizializzazione della classe (quelli che contengono __init__ nel proprio nome). Un ultimo esempio:

p.sort_stats('time', 'cum').print_stats(.5, 'init')

Questa riga ordina le statistiche innanzitutto in base al tempo, poi in base al tempo cumulativo ed infine stampa alcune statistiche. In particolare, la lista viene prima ridotta del 50% (".5") della sua dimensione originaria, vengono poi mantenute solamente le righe che contengono init ed infine questa sotto-sotto-lista viene stampata.

Se volete sapere quali sono le funzioni che hanno chiamato le precedenti, potete ora fare (p è ancora ordinato secondo gli ultimi criteri):

p.print_callers(.5, 'init')

ed otterrete la lista delle chiamanti per ognuna delle funzioni elencate.

Se volete avere a disposizione altre funzionalità, dovrete leggere il manuale, oppure indovinare il funzionamento delle seguenti funzioni:

p.print_callees()
p.add('fooprof')

Invocato come script, il modulo pstats è un browser statistico per la lettura e l'analisi dei risultati di un profilo. Ha una semplice interfaccia a riga di comando (implementata usando cmd) ed un aiuto interattivo.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.