6

我正在尝试使用 timeit 模块,但我不知道如何。我有一个主要的:

from Foo import Foo
if __name__ == '__main__':
...
   foo = Foo(arg1, arg2) 
   t = Timer("foo.runAlgorithm()")
   print t.timeit(2)

我的 Foo 类有一个名为 runAlgorithm() 的方法

错误是这样的:

NameError:未定义全局名称“foo”

我究竟做错了什么?我可以从类方法中抽出时间吗?

4

2 回答 2

16

您可以简单地传递方法(或任何可调用的),而不是使用必要的setup参数来设置 timeit 环境:

t = Timer(foo.runAlgorithm)

从文档中:

在 2.6 版更改: stmt 和 setup 参数现在也可以采用无需参数即可调用的对象。

如果你需要传递一些参数,你可以使用函数currying with functools.partial,例如:

class C:
    def printargs(self, a, b):
        print a, b

from functools import partial
foo = C()
t = Timer(partial(foo.printargs, 1, 2))
于 2010-10-18T15:55:47.647 回答
2

文档示例所示,您需要传递setup语句:

t = Timer("foo.runAlgorithm()", 'from __main__ import foo')
于 2010-10-18T15:53:24.433 回答