python3性能:使用range()与旧的while()循环

时间:2018-12-24 21:57:21

标签: python python-3.x performance range

在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)

1 个答案:

答案 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涉及较高的固定成本,但仅此一项就较低。