在ipython中使用timeit的问题

时间:2013-10-20 04:01:22

标签: python ipython timeit

我很快就试图在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:我使用this作为参考。另外,如果标题没有完全传达我的问题,请将标题编辑得更好。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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 =>根据总时间最小0.2 s的timeit模块约束,timeit将运行的最小循环次数

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

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

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

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

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