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