Невозможно заставить cProfile работать в IPython - PullRequest
13 голосов
/ 30 ноября 2009

Мне не хватает чего-то очень простого.

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)')

Когда я запускаю вышеуказанный код в IPython, я получаю:

NameError: name 'c' is not defined

Что мне не хватает?

ОБНОВЛЕНИЕ точноеВставка моей сессии здесь: http://pastebin.com/f3e1b9946

ОБНОВЛЕНИЕ Я не упомянул, что проблема возникает в IPython, который (как выясняется) является источником проблемы

Ответы [ 3 ]

26 голосов
/ 30 ноября 2009

Находясь внутри IPython, вы можете использовать функцию % prun magic :

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}
15 голосов
/ 22 июля 2010

Не проблема оригинального плаката, но вы можете также получить эту же ошибку, если вы вызываете cProfile.run () в чем-то отличном от пространства имен __main__ (из функции или импорта). В этом случае вам нужно использовать следующий метод вместо метода run ():

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

Спасибо этому посту за помощь в выяснении этого.

3 голосов
/ 30 ноября 2009

Несмотря на то, что IPython очень удобен, существует много редких случаев, когда он нарушает рабочий код или маскирует ошибки. Поэтому полезно попробовать код в стандартном интерпретаторе, когда вы получаете такие мистические ошибки.

...