为什么ipython魔术函数`%timeit -n1 code_block`多次执行`code_block`?

时间:2018-06-16 19:56:36

标签: python ipython timeit

我正在尝试使用ipython%timeit中多次运行特定测试 -n1魔法功能。出于演示目的,我将使用-n3代替 print(1)此处,并使用简单的%%timeit函数。

%timeitOptions: -n<N>: execute the given statement <N> times in a loop. If this value is not given, a fitting value is chosen. -r<R>: repeat the loop iteration <R> times and take the best result. Default: 3 (the 3 here is a typo in ipython, for which I have submitted a PR) 帮助说明如下:

%%timeit -n1
print(1)

但是,如果我执行以下操作:

%timeit -n1 print(1)

1

它实际上连续7次打印In[1]: %timeit -n1 print(1) 1 1 1 1 1 1 1 32.8 µs ± 38.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each) ,如下所示

%%timeit

由于%timeit / cell的定义,我期待它 只运行一次code%%timeit

我看过这篇文章:https://stackoverflow.com/a/45375047/4752883 其中给出了ipython如何运行以及%%timeit魔术函数-n<N>的实际源代码的一些示例 在这里:https://github.com/ipython/ipython/blob/ec3d1a11bf26a0962cb2cf55ba263b12ac023183/IPython/core/magics/execution.py#L944

他们定义了两种类型的循环:1)-r<R>和2)-n1

如果我只使用-r7,似乎它也假设我使用了-n1,即 -n1 -r7默认为code_block。这意味着即使我想要它运行 正好1次运行,它仍然会按照-n1 -r1 7次运行 https://github.com/ipython/ipython/blob/ec3d1a11bf26a0962cb2cf55ba263b12ac023183/IPython/core/magics/execution.py#L1021 除非我也指定code_block

问题:

  1. 为什么有两种不同的方法可以使用-n<N>-r<R>运行-n<N> -r<R>
  2. /^[CAGT]*$/test()之间有什么区别?为什么会这样? 必要?

1 个答案:

答案 0 :(得分:1)

这些参数也在timeit module

  • -n确定在时间窗口内运行 函数(或块或其他)的次数。所以秒表开始,代码运行n次,然后秒表结束。您应该运行足够多次以使结果有意义(timeit默认为10的幂,直到0.2秒为止。)
  • -r确定你应该做多少次重复(重复是#34;启动计时器,运行n次,停止计时器&#34;)。由于您的CPU安排其他进程等,总会出现一些错误,因此通常您希望运行几次,并且会获得这些r次的最佳值。 (timeit默认为3,并且您链接的源中的注释表明ipython的功能相同 - 但实际代码可能不同意。)

在伪python中,您可以看到nr如何影响时间过程:

time_hist = []
for _ in range(r):
    t0 = time.now()              # Start stopwatch (.now() is not a real function)
    for _ in range(n):
        # <your code block>
    t1 = time.now()              # Stop stopwatch

    time_hist.append(t1 - t0)    # Append time delta

 return min(time_hist)           # Return the min of the r deltas