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