在Python3中,我发现如果替换
对于范围(n)中的i:
声明
而我
我获得了可观的运行时间收益。我的循环在执行几个基本算术运算的地方并不累赘。
我为什么会看到这种行为的任何指针?
编辑:n的范围是K,10K,12K等的10s 我观察到的时间是12K的.19s,带while循环的10K的.12s。而使用“ while”循环时,我看到.11s代表12K,.08s代表10K。 这是我的程序:
target = 0 i = 1 #for i in range(1, n+1): while i < n+1: target += i * (2 ** (i - 1)) + (i * (i + 1))//2 i += 1 return target % (10 ** 9 + 7)
答案 0 :(得分:5)
range
涉及少量固定开销(要查找range
,首先是在全局变量中,然后在内置函数中,然后是泛型函数调用分派以及分配/初始化的成本)物体);如果n
足够小,则无法弥补降低的每循环成本:
In [1]: %%timeit -r5 n = 3
...: for i in range(n):
...: pass
...:
365 ns ± 15.1 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
In [2]: %%timeit -r5 n = 3
...: i = 0
...: while i < n:
...: i += 1
...:
252 ns ± 16.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
但是,当n
的大小变得适中时,减少的每件商品的开销就会得到回报:
In [3]: %%timeit -r5 n = 10
...: for i in range(n):
...: pass
...:
461 ns ± 18.1 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
In [4]: %%timeit -r5 n = 10
...: i = 0
...: while i < n:
...: i += 1
...:
788 ns ± 73.6 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
range
涉及较高的固定成本,但仅此一项就较低。