1

我很快尝试在 ipython 中计时 2 个函数,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:我用这个作为参考。另外,如果它不能准确地表达我的问题,请将标题编辑为更好的东西。

4

2 回答 2

2

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 us 大约是基线的 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.
于 2013-10-20T04:04:13.343 回答
1

所以我终于弄清楚发生了什么,感谢@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 将隐式运行的最小循环数,基于0.2总时间的最小 s 的timeit 模块约束

best of 3: 108 us per loop=> timeit 运行的最佳 3 循环所花费的平均时间。

假设每次运行的时间与最佳 3 次的平均值相同,每次运行的时间 = 108 us

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

即,(10^x) > 1.85 * (10^3)=>的最小 xx = 4

因此需要的最小循环 = 10^x = 10000 loops.

于 2013-10-20T06:20:23.497 回答