如何在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)”