将variables传递给函数时如何使用python timeit?
我正在努力用这个timeit,并想知道如果有人有任何提示
基本上我有一个函数(我传递一个值),我想testing的速度,并创造了这个:
if __name__=='__main__': from timeit import Timer t = Timer(superMegaIntenseFunction(10)) print t.timeit(number=1)
但是当我运行它,我得到奇怪的错误,如来自timeit模块:
ValueError: stmt is neither a string nor callable
如果我自己运行该function,它工作正常。 它的时候,我把它包装在它的模块,我得到的错误(我曾尝试使用双引号,并没有..sameoutput)。
任何build议将是真棒!
谢谢!
使之成为可调用的:
if __name__=='__main__': from timeit import Timer t = Timer(lambda: superMegaIntenseFunction(10)) print t.timeit(number=1)
应该pipe用
Timer(superMegaIntenseFunction(10))
表示“调用superMegaIntenseFunction(10)
,然后将结果传递给Timer
”。 这显然不是你想要的。 Timer
需要一个可调用的(就像它的声音:可以被调用的东西,比如一个函数)或者一个string(这样它就可以把这个string的内容解释为Python代码)。 Timer
通过重复调用可调用事物并查看需要多less时间来工作。
Timer(superMegaIntenseFunction)
会通过types检查,因为superMegaIntenseFunction
是可调用的。 但是, Timer
不知道传递给superMegaIntenseFunction
值是什么。
当然,这个简单的方法是在代码中使用string。 我们需要传递一个'setup'参数给代码,因为这个string在新的上下文中被解释为代码 – 它不能访问相同的globals
,所以你需要运行另外一些代码来使定义可用 – 请参阅@ oxtopus的答案。
使用lambda
(如superMegaIntenseFunction
的答案),我们可以将参数10
绑定到对superMegaIntenseFunction
的调用。 我们正在做的是创build另一个函数,它不带任何参数,并用10
调用superMegaIntenseFunction
。 就好像你已经使用了def
来创build另一个函数,除了新的函数没有得到一个名字(因为它不需要)。
你应该传递一个string。 即
t = Timer('superMegaIntenseFunction(10)','from __main__ import superMegaIntenseFunction')
为未来的访客提供一个便条 如果你需要在pdb
debugging器中工作,并且superMegaIntenseFunction
不在全局范围内,可以通过添加globals
来使其工作:
globals()['superMegaIntenseFunction'] = superMegaIntenseFunction timeit.timeit(lambda: superMegaIntenseFunction(x))
请注意,由于额外的函数调用,在这种情况下计时开销稍大。 [资源]