2015-02-12 3 views
-1

Я пытаюсь использовать timeit, чтобы получить время выполнения одной из функций в с двумя аргументами, но я продолжаю получать ошибку: невозможно импортировать имя make_heap() класс queueHeap(): защиту make_heap (я, крен): я = Len (крен) // 2 self.currentSize = Len (крен) self.heapList = [0] + крен [: ] в то время как (я> 0): self.swapDown (я) I = I - 1использовать timeit.Timer(), чтобы использовать функцию с двумя аргументами в классе

for num in range(1, 100, 10) : 
     L = [] 
     binaryHeap = queueHeap() 
     for i in range(1, num): 
       randomElement = random.randint(1, 100) 
       L.append(randomElement) 
       time_MakeHeap = timeit.Timer('make_heap(self, L)', 'from __main__ import make_heap, self, L') 
       print("n=%s: %s" % (num, time_MakeHeap.timeit(1))) 
+0

класс queueHeap(): – Joe

+0

Пожалуйста, исправьте форматирование кода в вопросе. В его нынешнем виде совершенно невозможно понять, что он делает, поскольку весь отступ испорчен, а часть его не находится в кодовом блоке. – Bakuriu

ответ

0

Проблема в том, что __main__ относится к току модуль, а не текущий scope.

Например, если у вас есть файл с testing.py:

class Test: 
    def method(self): 
     import __main__ 
     print(vars(__main__)) 

Test().method() 

Выход Забегая:

$python3 testing.py 
{'__file__': 'testing.py', '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7f5e8a027518>, '__doc__': None, '__spec__': None, '__name__': '__main__', '__package__': None, 'Test': <class '__main__.Test'>} 

Примечание:

  1. self не в словаре Возврат
  2. method не либо
  3. только переменные уровня модуля находятся там

так что вы не доступа self и method как это возможно. На самом деле, все это кажется действительно плохим дизайном. Почему вы хотите профилировать класс внутри одного из своих методов? Просто используйте экземпляр:

my_instance = MyClass() 
result = timeit.Timer('my_instance.the_method()', 'from __main__ import my_instance').timeit(1)