干货| Python实现循环的最快方式

众所周知,Python不是一种执行效率较高的语言。此外在任何语言中,循环都是一种非常消耗时间的操作。假如任意一种简单的单步操作耗费的时间为1个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。

这里插播一条粉丝福利,如果你正在学习Python或者有计划学习Python,想要突破自我,对未来十分迷茫的,可以点击这里获取最新的Python学习资料和学习路线规划(免费分享,记得关注)

While和For是Python中常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码:

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s


def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s


def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))


if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354

这是一个简单的求和操作,计算从1到n之间所有自然数的总和。可以看到For循环相比While要快1.5秒。其中的差距主要在于两者的机制不同。

在每次循环中,While实际上比For多执行了两步操作:边界检查和变量i的自增。即每进行一次循环,While都会做一次边界检查 (While i < n)和自增计算(i +=1)。这两步操作都是显示的纯Python代码。For循环不需要执行边界检查和自增操作,没有增加显示的Python代码(纯Python代码效率低于底层的 C代码)。

当循环的次数足够多,就出现了明显的效率差距。可以再增加两个函数,在For循环中加上不必要的边界检查和自增计算:​​​​​​​

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s


def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s


def for_loop_with_inc(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
        i += 1
    return s


def for_loop_with_test(n=100_000_000):
    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=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))
    print('for loop with increment\t\t',
          timeit.timeit(for_loop_with_inc, number=1))
    print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=1))


if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354
# => for loop with increment          4.602369500091299
# => for loop with test               4.18337869993411

可以看出,增加的边界检查和自增操作确实大大影响了For循环的执行效率。前面提到过,Python底层的解释器和内置函数是用C语言实现的。而C语言的执行效率远大于Python。对于上面的求等差数列之和的操作,借助于Python内置的Sum函数,可以获得远大于 For或While循环的执行效率。​​​​​​​

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s


def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s


def sum_range(n=100_000_000):
    return sum(range(n))


def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))
    print('sum range\t\t', timeit.timeit(sum_range, number=1))


if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354
# => sum range                0.8658821999561042

可以看到,使用内置函数Sum替代循环之后,代码的执行效率实现了成倍的增长。内置函数Sum的累加操作实际上也是一种循环,但它由C语言实现,而For循环中的求和操作是由纯Python代码s += i实现的。C > Python。

再拓展一下思维。小时候都听说过童年高斯巧妙地计算1到100之和的故事。1…100 之和等于 (1 + 100) * 50。这个计算方法同样可以应用到上面的求和操作中。​​​​​​​​​​​​​

import timeit


def while_loop(n=100_000_000):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s


def for_loop(n=100_000_000):
    s = 0
    for i in range(n):
        s += i
    return s


def sum_range(n=100_000_000):
    return sum(range(n))


def math_sum(n=100_000_000):
    return (n * (n - 1)) // 2


def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=1))
    print('for loop\t\t', timeit.timeit(for_loop, number=1))
    print('sum range\t\t', timeit.timeit(sum_range, number=1))
    print('math sum\t\t', timeit.timeit(math_sum, number=1))


if __name__ == '__main__':
    main()
# => while loop               4.718853999860585
# => for loop                 3.211570399813354
# => sum range                0.8658821999561042
# => math sum                 2.400018274784088e-06

最终Math sum的执行时间约为2.4e-6,缩短了上百万倍。这里的思路就是,既然循环的效率低,一段代码要重复执行上亿次。

索性直接不要循环,通过数学公式,把上亿次的循环操作变成只有一步操作。效率自然得到了空前的加强。

最后,我精心筹备了一份全面的Python学习大礼包,完全免费分享给每一位渴望成长、希望突破自我现状却略感迷茫的朋友。无论您是编程新手还是希望深化技能的开发者,都欢迎加入我们的学习之旅,共同交流进步!

🌟 学习大礼包包含内容:

Python全领域学习路线图:一目了然,指引您从基础到进阶,再到专业领域的每一步学习路径,明确各方向的核心知识点。

超百节Python精品视频课程:涵盖Python编程的必备基础知识、高效爬虫技术、以及深入的数据分析技能,让您技能全面升级。

实战案例集锦:精选超过100个实战项目案例,从理论到实践,让您在解决实际问题的过程中,深化理解,提升编程能力。

华为独家Python漫画教程:创新学习方式,以轻松幽默的漫画形式,让您随时随地,利用碎片时间也能高效学习Python。

互联网企业Python面试真题集:精选历年知名互联网企业面试真题,助您提前备战,面试准备更充分,职场晋升更顺利。

👉 立即领取方式:只需【点击这里】,即刻解锁您的Python学习新篇章!让我们携手并进,在编程的海洋里探索无限可能

 

学习编程的一个重要步骤是将理论知识与实际项目结合起来。《Python编程学习笔记:161页全干货分享》作为一份全面的学习资源,可以帮助你快速提升编程技巧并将其应用于实际项目中。首先,你可以根据学习笔记中的基础知识部分,熟悉Python的基本语法和数据结构。这部分内容是编程的基石,必须牢固掌握。例如,列表和字典的使用是Python编程中不可或缺的部分,通过笔记中提供的实例和练习,你可以深理解并学会在实际代码中灵活运用。 参考资源链接:[Python编程学习笔记:161页全干货分享](https://wenku.youkuaiyun.com/doc/g1jvhxdxpv) 接下来,深入学习控制结构和函数,这是编写高效可维护代码的关键。在学习笔记中,你会找到条件语句和循环语句的详细说明以及如何定义和使用函数。掌握这些内容后,你可以开始尝试编写简单的脚本,例如数据处理或自动化任务。 面向对象编程是提升代码组织和复用能力的重要环节。《Python编程学习笔记》将指导你理解类、对象、继承、多态和封装的概念,并通过实例深理解。通过实际编写类和对象,你可以更好地理解面向对象的设计思想。 为了将所学知识应用于实际项目,你还需要了解文件和数据格式处理、标准库和第三方库的使用。学习笔记中的这部分内容将帮助你学会读写文件和使用网络请求等,这对于数据处理和项目开发至关重要。 最后,学习笔记中的项目实践章节将指导你如何组织项目代码,使用版本控制系统,以及将项目部署到服务器或云平台。这是一个完整的项目生命周期的学习过程,让你不仅能编写代码,还能将代码转化为可以被他人使用和部署的应用。 通过以上步骤,你可以利用《Python编程学习笔记:161页全干货分享》从零开始,逐步提升到能够独立完成项目开发的水平。在学习的过程中,如果遇到任何疑难问题,建议参考学习笔记中的相关章节,或者查阅更详尽的技术文档和编程教程。 参考资源链接:[Python编程学习笔记:161页全干货分享](https://wenku.youkuaiyun.com/doc/g1jvhxdxpv)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值