2009-11-30 4 views
12

Il me manque quelque chose de très basique.Impossible de faire le travail cProfile dans 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)') 

Quand je lance le code ci-dessus dans IPython, je reçois:

NameError: name 'c' is not defined 

Qu'est-ce que je manque?

MISE À JOUR la pâte exacte de ma session est ici: http://pastebin.com/f3e1b9946

MISE À JOUR Je ne mentionne pas que le problème se produit dans IPython, qui (à il se trouve) est la source du problème

Répondre

24

Tandis qu'à l'intérieur IPython, vous pouvez utiliser le %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, c'est génial! Je ne connaissais pas% prun :) –

+0

Lien mort pour '% prun magic function', et je n'ai pas trouvé à quoi il devrait être mis à jour. – retracile

+1

@retracile: Merci pour le heads-up. Lien fixe. – unutbu

3

Bien que IPython soit très pratique, il y a beaucoup de cas rares où il casse le code de travail ou masque les erreurs. Il est donc utile d'essayer le code dans l'interpréteur standard lorsque vous rencontrez de telles erreurs mystiques.

15

pas le problème de l'affiche originale, mais vous pouvez aussi obtenir cette même erreur si vous invoquez cProfile.run() dans autre chose que le __main__ namespace (à partir d'une fonction ou d'une importation). Dans ce cas, vous devez utiliser les éléments suivants au lieu de la méthode run():

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

Kudos à this post pour me aider comprendre.

+0

Ah! Gagnant, je ne pouvais pas croire qu'il n'y avait pas moyen de profiler depuis le shell sans éditer mon code. –

Questions connexes