2013-04-18 11 views
5

sto cercando di seguire le istruzioni qui: http://docs.python.org/2/library/profile.html#module-cProfileCome si fa a far funzionare il profiler Python?

In particolare, questa parte:

import cProfile, pstats, io 
pr = cProfile.Profile() 
pr.enable() 
... do something ... 
pr.disable() 
s = io.StringIO() 
ps = pstats.Stats(pr, stream=s) 
ps.print_results() 

ho già deciso che print_results non è un vero e proprio metodo della classe Stats, né sembra davvero esistere ovunque. Qui è il mio codice corrente:

import cProfile, pstats, io 
def foo(request): 
    pr = cProfile.Profile() 
    pr.enable() 
    pass 
    pr.disable() 
    s = io.StringIO() 
    ps = pstats.Stats(pr, stream = s) 
    f = open('/profstats', 'a') 
    ps.print_stats() 
    f.write(s.getvalue()) 
    s.close() 
    f.close() 

risultato attuale è: TypeError a/ispezione-sintesi/ argomento unicode previsto, ha ottenuto 'str'

(output è così perché sto usando Django chiamare il codice in questione).

Così qualcuno sa come posso ottenere il profiler effettivamente, beh, lavoro? Voglio solo che il profilo sia come previsto, quindi stampare i risultati in un file in modo da poter visualizzare i risultati dopo l'esecuzione. Posso far funzionare dump_stats, ma il file che produce è spazzatura.

risposta

6

Infatti, l'API dei moduli profilo/pstats appare piuttosto ad-hoc. Penso che la linea ps.print_results() dovrebbe essere generica, cioè dovrebbe essere scritta come ps.call_some_methods_to_print_the_result(), ma questo non è chiaro. Per quanto riguarda dump_stats(), in realtà salva un file binario che può essere ricaricato in seguito.

Ecco un esempio che funziona per me:

import cProfile, pstats 
pr = cProfile.Profile() 
pr.enable() 
... 
pr.disable() 

f = open('x.prof', 'a') 
sortby = 'cumulative' 
pstats.Stats(pr, stream=f).strip_dirs().sort_stats(sortby).print_stats() 
f.close() 

valori validi di sortby sono: chiamate, cumulativo, di file, di linea, modulo, il nome, NFL (per il nome/file/linea), pcalls, stdname, time.

+2

+1 che lo snippet di codice nei documenti qui http://docs.python.org/2/library/profile.html#profile.Profile è confuso rispetto a quella riga ps.print_results(). – eedeep

5

Il problema nell'esempio nel manuale 2.7 sembra essere l'uso di StringIO. Quando uso un file reale come suggerito da Armin Rigo, quel cambiamento evita l'errore. Consulenza doc ri StringIO rilevo

L'oggetto StringIO possono accettare o Unicode o 8 bit stringhe, ma mescolando i due potrebbe prendere> certa cura. Se vengono utilizzati entrambi, le stringhe a 8 bit che non possono essere interpretate come ASCII a 7 bit (che>> utilizza l'ottavo bit) causeranno un errore UnicodeError quando viene chiamato getvalue().

getvalue() non viene chiamato qui, l'affermazione che non è in pstats.py, probabilmente il primo tentativo di stampa nelle print_stats() l'esecuzione con molti altri a seguire:

print >> self.stream, indent, self.total_calls, "function calls", 

I non vedo quale degli argomenti di stampa sta causando il problema e non vedo come ottenere StringIO per accettare qualsiasi cosa print_stats stia cercando di dargli - TUTTAVIA se si omette del tutto lo stream, l'output esce comunque sullo stdout :

pr.enable() 
(do the thing) 
pr.disable() 
pstats.Stats(pr).print_stats() 

Se stdout è abbastanza buono, è tutto.

Problemi correlati