python循环性能pk
在任何一种编程语言中,循环都是非常消耗时间的操作。假设任意一种简单的单步操作耗费的时间是1个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。众所周知,python不是一种执行效率较高的语言,因此,我们对于python语言里的循环性能更加关注。
for
和while
while
和for
是python中常用的两种实现循环的方法,但它们的运行效率实际上是有差距的。使用下面的测试代码:
import timeit
def while_loop(n=100):
i = 0
s = 0
while i < n:
s += i
i +=1
return s
def for_loop(n=100):
s = 0
for i in range(n):
s += i
return s
def main():
print('while loop:', timeit.timeit(while_loop, number=100))
print('for loop:', timeit.timeit(for_loop, number=100))
if __name__ == '__main__':
main()
运行结果:
可以看到:一个简单的求和的循环,for
循环要比while
循环快很多。
是什么导致这样的差距?
首先要说明的一点是:C代码效率优于python代码,这已经是常识。同时,Python 底层的解释器和内置函数是用 C 语言实现的。
实际上,在每次循环中,while
会比for
多执行两步操作:边界检查和变量i
的自增。即:while i < n
和i += 1
,并且这两步都是显示的纯python脚本。相比之下,for
循环不需要这两步额外的依赖于python脚本的操作,因此效率优于while
循环,并且随着循环次数不断增加,二者的运行效率差距也越来越大。
为了证实以上的解释,我们做如下的试验:
import timeit
def while_loop(n=100):
i = 0
s = 0
while i < n:
s += i
i += 1
return s
def for_loop(n=100):
s = 0
for i in range(n):
s += i
return s
def for_loop_with_inc(n=100):
s = 0
for i in range(n):
s += i
i += 1
return s
def for_loop_with_test(n=100):
s = 0
for i in range(n):
if i < n:
pass
s += i
return s
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=10000))
print('for loop\t\t', timeit.timeit(for_loop, number=10000))
print('for loop with increment\t\t',
timeit.timeit(for_loop_with_inc, number=10000))
print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=10000))
if __name__ == '__main__':
main()
运行结果:
可以看到,试验的结果证实了上面的结论。
内置函数
依然使用上面的例子,python里有一个内置的函数sum()
可以求和,我们来对比下sum()
和循环的效率。
import timeit
def while_loop(n=100):
i = 0
s = 0
while i < n:
s += i
i += 1
return s
def for_loop(n=100):
s = 0
for i in range(n):
s += i
return s
def sum_range(n=100):
return sum(range(n))
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=10000))
print('for loop\t\t', timeit.timeit(for_loop, number=10000))
print('sum range\t\t', timeit.timeit(sum_range, number=10000))
if __name__ == '__main__':
main()
运行结果:
可以看到,sum()
执行求和最快!这是因为sum()
函数是内置函数,它是用c语言进行循环的,因此它比前面的while
和for
效率更高。
继续优化
为了解决等差数列求和这个问题,我们除了粗暴循环还有什么好的方法吗?掌握基础的数学知识就可以知道:
S
u
m
(
A
n
)
=
a
1
+
a
n
2
∗
n
Sum({A_n})=\frac{a_1 + a_n}{2}*n
Sum(An)=2a1+an∗n.我们来测试一下直接计算的效率。
import timeit
def while_loop(n=100):
i = 0
s = 0
while i < n:
s += i
i += 1
return s
def for_loop(n=100):
s = 0
for i in range(n):
s += i
return s
def sum_range(n=100):
return sum(range(n))
def math_sum(n=100):
return (n * (n - 1)) // 2
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=10000))
print('for loop\t\t', timeit.timeit(for_loop, number=10000))
print('sum range\t\t', timeit.timeit(sum_range, number=10000))
print('math sum\t\t', timeit.timeit(math_sum, number=10000))
if __name__ == '__main__':
main()
运行结果:
效率又提升了,原因很明显,我们只用一步操作就得到了结果,避免了成千上万次的循环(不管是python还是c),代码的效率自然达到了空前的提升。
最终结论
经过以上的测试,我们得到了最终的结论:实现循环的最快方式,就是不用循环。如果无法完全的避免循环,那么尽量使用python的内置函数,并且减少循环中的纯python脚本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)