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

为未来的访客提供一个便条 如果你需要在pdbdebugging器中工作,并且superMegaIntenseFunction不在全局范围内,可以通过添加globals来使其工作:

 globals()['superMegaIntenseFunction'] = superMegaIntenseFunction timeit.timeit(lambda: superMegaIntenseFunction(x)) 

请注意,由于额外的函数调用,在这种情况下计时开销稍大。 [资源]