Невозможно заставить cProfile работать в 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)')
Когда я запускаю приведенный выше код в IPython, я получаю:
NameError: name 'c' is not defined
Что мне не хватает?
ОБНОВЛЕНИЕ , точная вставка моей сессии находится здесь: http://pastebin.com/f3e1b9946 р>
ОБНОВЛЕНИЕ Я не упомянул, что проблема возникает в IPython, который (как выясняется) является источником проблемы
Решение
Находясь внутри 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}
Другие советы
Не проблема оригинального автора, но вы можете также получить эту же ошибку, если вы вызываете cProfile.run () в чем-то отличном от пространства имен __main__ (из функции или импорта). В этом случае вам нужно использовать следующий метод вместо метода run ():
cProfile.runctx("your code", globals(), locals())
Престижность этой записи за то, что помог мне разобраться.
Хотя IPython очень удобен, существует много редких случаев, когда он нарушает рабочий код или маскирует ошибки. Поэтому, когда возникают такие мистические ошибки, полезно попробовать код в стандартном интерпретаторе.