我得到了以下两个python timeit行的不同结果。
print(min(timeit.repeat(lambda: 1+1)))
print(min(timeit.repeat('lambda: 1+1')))
输出类似于:
0.13658121100002063
0.10372773000017332
你能帮忙解释一下它们之间的区别吗?
答案 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