在IPython中使用timeit问题(Issues with using timeit in ip

2019-10-18 19:26发布

我很快就试图时间2个功能IPython中, m1()m2()这样做有2个不同的执行相同的任务。

In [23]: %timeit for x in range(100): m1(a)
10000 loops, best of 3: 57.6 us per loop

In [24]: %timeit for x in range(100): m2(a)
10000 loops, best of 3: 108 us per loop

结果:第一个实现几乎快2倍。 到现在为止还挺好。

出于好奇,我改的范围for上述循环,现在我在输出的损失决策意识。

In [25]: %timeit for x in range(1): m2(a)
1000000 loops, best of 3: 1.29 us per loop

In [26]: %timeit for x in range(10): m2(a)
100000 loops, best of 3: 10.8 us per loop

In [27]: %timeit for x in range(1000): m2(a)
1000 loops, best of 3: 1.06 ms per loop

究竟是什么在for循环在这里做什么? 为什么不循环的数量的值减少对增大范围值?

PS:我是用这个作为参考。 另外,请更好的编辑标题的东西,如果它不完全表达我的问题。

Answer 1:

timeit计数的执行时间为整个块。

所以你看到的是:

  • 运行m2(a) 1周时间花费1.29 us
  • 运行m2(a) 10倍花费10.8 us
  • 运行m2(a) 1000倍需要1.06 ms

这有一定道理,因为1.06ms = 1060 us ,大约1000倍基线(10.8美国大约是10倍基线)

至于环路数量讲,timeit的目的是在合理的时间内运行:

$ python -mtimeit -h
...
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.


Answer 2:

所以,我终于想通了什么事情,感谢@ Nirk的答案。

In [26]: %timeit for x in range(100): m2(a)
10000 loops, best of 3: 108 us per loop

这里,

%timeit = IPython的魔术呼叫>

for x in range(100): m2(a) =>正在执行的语句。 根据范围值,执行时间增加/每次运行而减小

10000 loops =>最小数目timeit将implicilty运行循环的基础上,timeit模块最小的约束0.2 S的总时间

best of 3: 108 us per loop由最好3环由timeit运行采取=>平均时间。

假设时间每次运行是相同的平均最好如图3所示,时间为每个运行= 108我们

最小环路需要= 10^x ,其中x是最小正整数满足1.08 * (10^-4) * (10^x) > 2 * (10^-1)

即,最小x为哪些(10^x) > 1.85 * (10^3) => x = 4

需要= 10 ^ X =最小。因此循环10000 loops



文章来源: Issues with using timeit in ipython