我很快就试图时间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:我是用这个作为参考。 另外,请更好的编辑标题的东西,如果它不完全表达我的问题。
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.
所以,我终于想通了什么事情,感谢@ 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
。