2009-11-30 21 views
12

Me falta algo muy básico.No se puede hacer que cProfile funcione en 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)') 

Cuando ejecuto el código anterior en IPython, me sale:

NameError: name 'c' is not defined 

¿Qué me falta?

ACTUALIZACIÓN la pasta exacta de mi sesión está aquí: http://pastebin.com/f3e1b9946

ACTUALIZACIÓN que no mencionó que el problema se produce en IPython, que (por lo que resulta) es la fuente del problema

Respuesta

24

Mientras que dentro IPython, se puede utilizar el %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

Guau, ¡eso es genial! No sabía sobre% prun :) –

+0

Enlace muerto para '% prun magic function', y no encontré en qué debería actualizarse. – retracile

+1

@retracile: Gracias por el aviso. Enlace fijo – unutbu

3

Aunque IPython es muy útil, hay un montón de casos raros cuando se rompe el código de trabajo o se enmascaran los errores. Por lo tanto, es útil intentar codificar en un intérprete estándar cuando se producen dichos errores místicos.

15

No es un problema de su creador original, pero también se puede obtener el mismo error si está invocando cProfile.run() en algo más que el __main__ espacio de nombres (desde dentro de una función o una importación). En ese caso es necesario utilizar el siguiente en lugar del método run():

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

Felicitaciones a this post por ayudarme a resolver esto.

+0

¡Ah! Ganador, no podía creer que no hubiera forma de perfilar desde el intérprete de comandos sin editar mi código. –

Cuestiones relacionadas