Python实现循环的最快方式(for、while等速度对比)

news2024/10/6 12:31:26

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

whilefor 是 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 函数,可以获得远大于 forwhile 循环的执行效率。

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 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习大礼包👈

包括:Python开发工具、Python100道练习题、Python爬虫&数据分析&人工智能&办公自动化等学习资料

在这里插入图片描述

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaCV - 图像暗通道去雾

一、效果图 二、实现原理 暗通道先验:首先说在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值,也就是说该区域光强是一个很小的值。所以给暗通道下了个数学定义,对于任何输入的图像J,其暗通道可以用下面的公式来表示:其中JC表示彩色图像每个…

SOFA Weekly|SOFAChannel#33 直播预告、Layotto 社区会议回顾与预告、社区本周贡献

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展 欢迎留言互动&#xff5e; SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&am…

阿里、腾讯、京东齐降价:云计算迎来新拐点

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 618源于京东创办日&#xff08;创办于2004年6月18日&#xff09;&#xff0c;发展至今&#xff0c;618已然成为中国两大最火爆的消费节点之一。每年618&#xff0c;京东都会推出覆盖全品类的优惠政策&#xff0c;并以严格的…

chatgpt赋能python:Python捕获所有异常

Python 捕获所有异常 Python是一种易用、高效的编程语言&#xff0c;广泛应用于Web开发、数据科学、人工智能等领域。在Python编程中&#xff0c;异常处理是一项重要的技能&#xff0c;因为程序总会出现各种异常情况&#xff0c;如输入错误、网络错误、程序崩溃等等。Python提…

矿井水除氟——高矿化度矿井水氟化物深度降解的技术方案

高矿化度矿井水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

(十七)ArcGIS 属性表生成GUID字段

ArcGIS 属性表生成GUID字段 目录 ArcGIS 属性表生成GUID字段 1.GUID概念2.GUID格式3. ArcGIS 属性表生成GUID字段3.1新建GUID字段3.2生成GUID字段 1.GUID概念 全局唯一标识符&#xff08;GUID&#xff0c;Globally Unique Identifier&#xff09;是一种由算法生成的二进制长度…

堆的实现+堆的应用(堆排序和Topk)

珍惜当下的一切&#xff0c;相信未来的一切都是美好的。 -- 丹尼尔迪凯托目录 一.堆的概念及结构 二.堆的各种函数的实现 1.结构体的内容 2.堆的初始化 3.堆的插入 4.堆的向上调整法 5.验证堆的向上调整法 6.堆顶的删除 7.堆的向下调整法 8.返回堆…

【Python】使用百度AI能力

知识目录 一、写在前面✨二、百度AI能力介绍三、植物识别四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 Python调用百度AI能力进行植物识别。 &#xff0c;希望能帮助到大…

欧盟加密监管法案通过,美国急了?

万众期待的欧盟《加密资产市场监管法案》&#xff08;Markets in Crypto-Assets Regulation&#xff0c;简称MiCA&#xff09;终于在5月16日尘埃落定。 尽管在4月20日&#xff0c;该方案已在欧洲议会全体会议上投票通过&#xff0c;但直到5月16日&#xff0c;包括27个国家的欧盟…

STP生成树协议(超详细小白也能看懂)

一、为什么要用STP 为了提高网络可靠性&#xff0c;交换网络中通常会使用冗余链路。然而&#xff0c;冗余链路会给交换网络带来环路风险&#xff0c;并导致广播风暴以及MAC地址表不稳定等问题&#xff0c;进而会影响到用户的通信质量。生成树协议STP&#xff08;Spanning Tree …

计算机毕业论文选题推荐|软件工程|系列十

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 基于(***语言)多媒体教室管理…

Hugging News #0526: Hugging Cast 发布第一期、邀请来认领自己的论文啦!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

es7.x Es常用核心知识快捷版1(分词和text和keyword)

一 分词 1.1 分词 1.1.1 查看分词 standard标准分析器是将每个字都分出来&#xff1b; 而ik_max_word是最细粒度的分词&#xff0c;将所有可能的词都分出来&#xff1b; ik_smart 是最粗粒度的分词&#xff1b; ik_smart 优点:特征是粗略快速的将文字进行分词,占用空间小…

程序员,你被打标签了没?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 朱峰 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦midjourney 产品统筹 / bobo 赚钱多、回家少、死的早&#xff0c;似乎成了现在对程序员的刻板印象。 本期节目&#xff0c;我们将跳出传统的科技讨论圈&#xff0c…

这个 选择排序详解过程 我能吹一辈子!!!

文章目录 选择排序概念选择排序算法思路选择排序代码实现选择排序优化 选择排序概念 选择排序&#xff1a;即每次选择第一个数为最小或者最大与之后的元素进行比较&#xff0c;循环都能找到一个最大或者最小放到序列的两端。 选择排序算法思路 选择排序是一种简单直观的排序…

chatgpt赋能python:Python操作表格的全面指南

Python操作表格的全面指南 表格是一种非常实用的数据展示方式&#xff0c;程序员在处理数据以及展示数据时也经常使用表格。Python提供了多个强大的库操作表格&#xff0c;本文将为你介绍一些常见的Python操作表格的方式——包括读取、写入、处理和操作。 读取表格 Python提…

文献阅读-A Survey on Transfer Learning 和 A Survey on Deep Transfer Learning

论文&#xff1a; A Survey on Transfer Learning 期刊会议&#xff1a;IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING 时间&#xff1a;2010 级别&#xff1a;CCF A 论文&#xff1a; A Survey on Deep Transfer Learning 期刊会议&#xff1a;International Confere…

LRU 该用什么数据结构

LRU&#xff08;最近最少使用&#xff09;&#xff0c;是一种缓存置换算法。缓存是用来存储常用的数据&#xff0c;加速常用数据访问的数据结构。有软件实现&#xff0c;比如数据库的缓存&#xff1b;也有硬件实现&#xff0c;比如我们上一讲学的 TLB。缓存设计中有一个重要的环…

chatgpt赋能Python-python_怎么赋值

介绍 Python是一种高级编程语言&#xff0c;它的强大之处在于它的简洁性和易读性。由于其简单易学&#xff0c;灵活性和可移植性&#xff0c;Python在Web开发、自动化测试和数据分析等领域得到了广泛的应用。在Python中&#xff0c;赋值是一项基本的操作&#xff0c;这篇文章将…

【第八期】Apache DolphinScheduler 每周 FAQ 集锦

点击蓝字 关注我们 摘要 为了让 Apache DolphinScheduler 的广大用户和爱好者对于此项目的疑问得到及时快速的解答&#xff0c;社区特发起此次【每周 FAQ】栏目&#xff0c;希望可以解决大家的实际问题。 关于本栏目的要点&#xff1a; 本栏目每周将通过腾讯文档&#xff08;每…