使用timeit.Timer()来计算类中带有两个参数的函数

时间:2015-02-12 07:39:23

标签: python self timeit

我正在尝试使用timeit来获取其中一个函数的运行时间 有两个参数,但我不断收到错误:无法导入名称make_heap()     class queueHeap():     def make_heap(self,alist):                 i = len(alist)// 2                 self.currentSize = len(alist)                 self.heapList = [0] + alist [:]                 而(i> 0):                         self.swapDown(ⅰ)                         i = i - 1

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

1 个答案:

答案 0 :(得分:0)

问题是__main__是指当前的模块,而不是当前的范围

例如,如果您的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. 只有模块级变量
  4. 因此无法访问selfmethod。事实上,整个事情看起来真的很糟糕。为什么要在其中一个方法中分析一个类?只需使用一个实例:

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