ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python循环性能pk

2021-12-30 18:33:08  阅读:194  来源: 互联网

标签:__ timeit python sum while 循环 def pk loop


python循环性能pk

在任何一种编程语言中,循环都是非常消耗时间的操作。假设任意一种简单的单步操作耗费的时间是1个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。众所周知,python不是一种执行效率较高的语言,因此,我们对于python语言里的循环性能更加关注。

forwhile

whilefor是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()

运行结果:

# while loop: 0.11076588099240325
# for loop: 0.03892302500025835

可以看到:一个简单的求和的循环,for循环要比while循环快很多。

是什么导致这样的差距?

首先要说明的一点是:C代码效率优于python代码,这已经是常识。同时,Python 底层的解释器和内置函数是用 C 语言实现的

实际上,在每次循环中,while会比for多执行两步操作:边界检查和变量i的自增。即:while i < ni += 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()

运行结果:

# while loop		 0.08734580200689379
# for loop		 0.039982129994314164
# for loop with increment		 0.04891946600400843
# for loop with test		 0.04814562000683509

可以看到,试验的结果证实了上面的结论。

内置函数

依然使用上面的例子,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()

运行结果:

# while loop		 0.052548438994563185
# for loop		 0.0333536260004621
# sum range		 0.00758898000640329

可以看到,sum()执行求和最快!这是因为sum()函数是内置函数,它是用c语言进行循环的,因此它比前面的whilefor效率更高。

继续优化

为了解决等差数列求和这个问题,我们除了粗暴循环还有什么好的方法吗?掌握基础的数学知识就可以知道: 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()

运行结果:

# while loop		 0.060537102006492205
# for loop		 0.03300404299807269
# sum range		 0.007836175005650148
# math sum		 0.0013752939994446933

效率又提升了,原因很明显,我们只用一步操作就得到了结果,避免了成千上万次的循环(不管是python还是c),代码的效率自然达到了空前的提升。

最终结论

经过以上的测试,我们得到了最终的结论:实现循环的最快方式,就是不用循环。如果无法完全的避免循环,那么尽量使用python的内置函数,并且减少循环中的纯python脚本。

标签:__,timeit,python,sum,while,循环,def,pk,loop
来源: https://blog.csdn.net/baidu_33312138/article/details/122241610

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有