2009-11-30 9 views
12

Mi manca qualcosa di molto semplice.Impossibile eseguire cProfile in IPython

class C: 
    def __init__(self): 
     self.N = 100 
     pass 

    def f(self, param): 
     print 'C.f -- param' 
     for k in xrange(param): 
      for i in xrange(self.N): 
       for j in xrange(self.N): 
        a = float(i)/(1+float(j)) + float(i/self.N) ** float(j/self.N) 

import cProfile 

c = C() 
cProfile.run('c.f(3)') 

Quando eseguo il codice di cui sopra in IPython, ottengo:

NameError: name 'c' is not defined 

Che cosa mi manca?

UPDATE l'esatto pasta di mia sessione è qui: http://pastebin.com/f3e1b9946

UPDATE non ha menzionato che il problema si verifica in IPython, che (a si scopre) è la fonte del problema

risposta

24

Mentre all'interno IPython, è possibile utilizzare il %prun magic function:

In [9]: %prun c.f(3) 
C.f -- param 
     3 function calls in 0.066 CPU seconds 

    Ordered by: internal time 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.066 0.066 0.066 0.066 <string>:6(f) 
     1 0.000 0.000 0.066 0.066 <string>:1(<module>) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
+0

Wow, è grandioso! Non sapevo nulla su% prun :) –

+0

Link morto per '% prun magic function', e non ho trovato a cosa dovrebbe essere aggiornato. – retracile

+1

@retracile: Grazie per l'heads-up. Link fisso. – unutbu

3

Sebbene IPython sia molto utile, ci sono molti casi rari quando si rompono errori di codice o maschere. Quindi è utile provare il codice nell'interprete standard quando si verificano tali errori mistici.

15

Non il problema del manifesto originale, ma è anche possibile ottenere lo stesso errore se si invoca cProfile.run() in qualcosa di diverso dal __main__ spazio dei nomi (da una funzione o un'importazione). In questo caso è necessario utilizzare il seguente invece del metodo run():

cProfile.runctx("your code", globals(), locals()) 

Complimenti a this post per avermi aiutato a capire questo.

+0

Ah! Vincitore, non potevo credere che non ci fosse modo di creare un profilo dalla shell senza modificare il mio codice. –

Problemi correlati