我正在尝试使用ipython
在%timeit
中多次运行特定测试
-n1
魔法功能。出于演示目的,我将使用-n3
代替
print(1)
此处,并使用简单的%%timeit
函数。
%timeit
和Options: -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
。
-n<N>
和-r<R>
运行-n<N>
-r<R>
?/^[CAGT]*$/
和test()
之间有什么区别?为什么会这样?
必要?答案 0 :(得分:1)
这些参数也在timeit module。
中-n
确定在时间窗口内运行 函数(或块或其他)的次数。所以秒表开始,代码运行n
次,然后秒表结束。您应该运行足够多次以使结果有意义(timeit
默认为10的幂,直到0.2秒为止。)-r
确定你应该做多少次重复(重复是#34;启动计时器,运行n次,停止计时器&#34;)。由于您的CPU安排其他进程等,总会出现一些错误,因此通常您希望运行几次,并且会获得这些r
次的最佳值。 (timeit
默认为3,并且您链接的源中的注释表明ipython的功能相同 - 但实际代码可能不同意。)在伪python中,您可以看到n
和r
如何影响时间过程:
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