如何在Python中解释timeit命令
例如,我有一个列表:如何在Python中解释timeit命令,python,time,ipython,generator,python-2.x,Python,Time,Ipython,Generator,Python 2.x,例如,我有一个列表: L=[-13, -24, -21, -3, -23, -15, -14, -27, -13, -12] 如果输入%timeit-n 10 myList=[如果项目
L=[-13, -24, -21, -3, -23, -15, -14, -27, -13, -12]
%timeit-n 10 myList=[如果项目<15,则输入L中项目的项目]
输出为10个环路,每个环路的最佳输出为3:1.25µs
myGen=(如果项目<15,则L中的项目对应项目)
输出为1000000个循环,每个循环3:561ns的最佳值
我不明白在案例2中,为什么一个生成器需要1000000个循环而不是10个循环?“三选一”是什么意思?我如何计算出每一个公共数据所需的总秒数,比如案例1中的10*1.25=12.5秒?在第二个示例中,您没有将
-n
参数包含在%timeit
中,因此ipython根据试运行的时间来改变重复次数;被测试的代码越快,为了获得更准确的每次迭代时间值而进行的迭代就越多
此外,测试会运行几次,以尽量减少外部因素(例如,当您的操作系统恰好安排了磁盘缓冲区刷新,而其他一切都变得稍微慢一点时)。这就是“三选一”的用武之地;测试连续运行3次,并选择最佳时间
请参阅,其中包括这些选项及其默认行为:
-n
:在循环中执行给定语句
次。如果未给出该值,则选择拟合值
-r
:重复循环迭代
次,获得最佳结果。默认值:3
您的第一个示例使用了-n10
,因此它只运行了10次
由于使用生成器表达式创建生成器对象几乎是即时的,因此ipython可以以比执行列表理解更频繁的方式执行循环(列表理解必须执行for
循环,然后生成包含所有结果的列表对象)。请记住,在您驱动迭代之前,生成器表达式不会执行任何操作
如果要比较生成器表达式生成与列表理解相同结果所需的时间,则必须实际进行迭代。您可以将表达式传递给list()
调用以实际生成列表:
%timeit -n 10 myGen = (item for item in L if item < 15); list(myGen)
%timeit-n 10 myGen=(如果项目<15,则L中的项目对应项目);列表(myGen)
这会比较慢,因为生成器的开销略高于列表:
In [1]: L=[-13, -24, -21, -3, -23, -15, -14, -27, -13, -12]
In [2]: %timeit -n 10 myList = [item for item in L if item < 15]
10 loops, best of 3: 1.29 µs per loop
In [3]: %timeit -n 10 myGen = (item for item in L if item < 15); list(myGen)
10 loops, best of 3: 1.72 µs per loop
In[1]:L=[-13,-24,-21,-3,-23,-15,-14,-27,-13,-12]
在[2]中:%timeit-n10 myList=[如果项目<15,则L中的项目对应项目]
10个回路,最好为3个:每个回路1.29µs
[3]中:%timeit-n10 myGen=(如果项目<15,则L中的项目对应项目);列表(myGen)
10个回路,最好为3个:每个回路1.72µs
请注意,您必须在每次测试迭代中重新创建生成器,因为生成器只能生成一次输出。“3的最佳值”来自重复次数:-r N,--repeat=N“重复计时器的次数(默认值3)”