2009-11-30 7 views
12

Ich vermisse etwas sehr einfach.Kann nicht cProfile arbeiten 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)') 

Wenn ich den obigen Code in IPython laufen, erhalte ich:

NameError: name 'c' is not defined 

Was bin ich?

UPDATE die genaue Paste meiner Sitzung ist hier: http://pastebin.com/f3e1b9946

UPDATE ich nicht erwähnt, dass das Problem in IPython auftritt, die (es stellt sich heraus) ist die Quelle des Problems

Antwort

24

Während innerhalb IPython, können Sie die %prun magic function verwenden:

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, das ist großartig! Ich wusste nicht über% Prun :) –

+0

Dead Link für '% Prun magische Funktion', und ich habe nicht gefunden, was es aktualisiert werden sollte. – retracile

+1

@retracile: Danke für das Heads-up. Link repariert – unutbu

3

Obwohl IPython sehr praktisch ist, gibt es viele seltene Fälle, in denen es funktionierenden Code oder Maskenfehler unterbricht. Es ist also nützlich, Code im Standardinterpreter zu versuchen, wenn solche mystischen Fehler auftreten.

15

nicht das ursprüngliche Plakat das Problem, aber Sie können auch diesen gleichen Fehler, wenn Sie cProfile.run() in etwas anderes als die __main__ sich berufen Namespace (innerhalb einer Funktion oder eines Imports). In diesem Fall müssen Sie die folgende Stelle der run() Methode verwenden:

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

Ein großes Lob an this post mir geholfen dies herauszufinden.

+0

Ah! Gewinner, ich konnte nicht glauben, dass es keine Möglichkeit gab, von der Shell zu profilieren, ohne meinen Code zu bearbeiten. –