为什么lambda函数执行时间在作为callable传递时与传递给timeit.repeat()作为字符串语句不同?

时间:2017-10-01 08:30:49

标签: python timeit

我得到了以下两个python timeit行的不同结果。

print(min(timeit.repeat(lambda: 1+1)))
print(min(timeit.repeat('lambda: 1+1')))

输出类似于:

0.13658121100002063
0.10372773000017332

你能帮忙解释一下它们之间的区别吗?

1 个答案:

答案 0 :(得分:6)

第二眼看,这是一个非常有趣的问题!

但首先,请再看一下the docs

  

stmt setup 参数也可以使用不带参数的可调用对象。这将在计时器函数中嵌入对它们的调用,然后由timeit()执行。请注意,由于额外的函数调用,在这种情况下,时序开销稍大一些。

当您设法不陷入陷阱以将观察到的差异归因于函数调用开销时,您会注意到:第一个参数是被调用的可调用语句< / em>已执行。

因此,在您的两行代码中,您可以衡量两种不同的行为。

在第一行中传递一个被调用的可调用函数,并测量其执行时间:

timeit.repeat(lambda: 1+1)

在这里传递正在执行的语句并测量其执行时间:

timeit.repeat('lambda: 1+1')

请注意,在第二种情况下,您实际上并未调用该函数,而是测量创建lambda所需的时间!

如果你想再次测量函数调用的执行时间,你应该写下这样的东西:

timeit.repeat('test()', 'test=lambda: 1+1')

为了比较,请看这个例子:

import time
print(min(timeit.repeat(lambda: time.sleep(1), number=1))) 
print(min(timeit.repeat('lambda: time.sleep(1)', number=1))) 

输出清楚地显示了差异(第一次调用函数,第二次创建函数):

1.0009081270000024
5.370002327254042e-07