Вопрос

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

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 очень удобен, существует много редких случаев, когда он нарушает рабочий код или маскирует ошибки. Поэтому, когда возникают такие мистические ошибки, полезно попробовать код в стандартном интерпретаторе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top