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

Python 为什么lambda函数执行时间在作为可调用语句传递与作为字符串语句传递给timeit.repeat()时不同?,python,timeit,Python,Timeit,我得到了以下两条python时间线的不同结果 print(min(timeit.repeat(lambda: 1+1))) print(min(timeit.repeat('lambda: 1+1'))) 输出类似于: 0.13658121100002063 0.10372773000017332 你能帮我解释一下它们之间的区别吗?乍一看,这是一个非常有趣的问题 但首先,请再看一看: stmt和setup参数还可以接受无参数可调用的对象。这将在计时器函数中嵌入对它们的调用,然后由timeit

我得到了以下两条python时间线的不同结果

print(min(timeit.repeat(lambda: 1+1)))
print(min(timeit.repeat('lambda: 1+1')))
输出类似于:

0.13658121100002063
0.10372773000017332

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

乍一看,这是一个非常有趣的问题

但首先,请再看一看:

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

当您设法不落入将观察到的差异归因于函数调用开销的陷阱时,您会注意到:第一个参数要么是调用的可调用参数,要么是执行的语句

因此,在您的两行代码中,您可以度量两种不同事物的性能

在第一行中,您传递了一个被调用的callable,并测量了它的执行时间:

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

注意,在第二种情况下,您实际上并没有调用函数,而是测量创建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))) 
输出清楚地显示了差异(第一个调用函数,第二个创建函数):

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