被骗了,原来让 Python 循环最快的方式,竟然就是不用循环?

被骗了,原来让 Python 循环最快的方式,居然就是不用循环? 人生苦短,快学Python! 众所周知,Python 不是一种执行效率较高的语言。此外在任何语言中,循环都是一种非常消耗时间的操作。假如任意一种简单的单步操作耗费的时间为 1 个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。 while 和 for 是 Python 中常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码: importtimeit defwhile_loop(n=100_000_000): i=0 s=0 ... 阅读详情

不知道大家有没有考虑过,用循环与不用循环到底哪个速度快?

什么原因导致速度快慢的呢?

今天通过常用的循环来分析一下。

人生苦短,快学Python!

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

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兼职),下面这些你应该能用得上:

【点击这里】领取!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④华为出品独家Python漫画教程 ,手机也能学习
⑤ 历年互联网企业Python面试真题,复习时非常方便
————————————————
在这里插入图片描述

学1个月爬虫就月赚6000?别被骗了,老师傅告诉你爬虫的真实情况 爬虫的四个水平,你在哪一个层次?巅峰爬虫是什么样子? 阅读详情

相关推荐

intel-VROC raid卡驱动 centos7.9

u盘进入系统,按e,在出现下面在quiet前面输入inst.dd initcall_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。进入系统,按e,在出现下面在quiet前面输入inst.dd inicll_blacklist=vmd_drv_init 后按Ctrl和x,开始引导。驱动完成后,在输入 c 回车, 引导过程开始,进入安装界面。输入1 ,选择这个ISO驱动文件里的rpm包。输入1 ,选择这个ISO驱动文件里的rpm包。vi编辑 /etc/default/grub。

dacming的博客 4541

服了,Python 实现循环的最快方式原来是这样

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

Python学习与数据挖掘 1814

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 434

python编程练习:不使用循环,写一个函数,可以求任意自然数n的阶乘

def func(n): if n==1: return 1 elif n==0: return 0 else: return n*func(n-1) if __name__ == '__main__': number=int(input("请输入一个自然数:")) print(func(number)) 运行结果: ...

jingyueshi2009的博客 1000

ETL第八章无人售货机零售项目实践

ETL实战项目——无人售货机

m0_52058217的博客 4418

Metal 一、初识 Metal 及其语言规范

游戏开发者的新的技术平台,该技术能够为3D图像提高 10 倍的渲染性能。苹果2018年推出 Metal,在此之前一直使用OpenGL ES。1图形渲染;2高并发计算。苹果文档给出的 Metal 优化:CPU 低消耗、GPU 高利用、连续处理器并行、有效的资源利用Metal 官方文档。

irainsa的博客 1219

不使用循环结构解决循环问题的方法

循环问题的另类解决办法。

delphiwcdj的专栏 1700

浅谈车载控制器产线EOL实现方式

1、控制器生产产线上电路检测设计 2、客户总装产线检测设计

u012406840的博客 2万+

Python中最快的循环方式

今天我们来研究一下 Python 中最快的循环方式。

z099164的博客 1810

免安装版Notepad++终极配置:右键菜单+图标美化+多文件批量处理(2024新版)

本文详细介绍了如何为免安装版Notepad++进行终极配置,包括右键菜单添加、图标美化以及多文件批量处理功能。通过注册表编辑和高级定制,用户可以在便携版中实现与安装版相同的功能体验,同时保持系统整洁。特别适合开发者、系统管理员和效率追求者使用。

nut55的博客 830

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3366

Python 哪种方式循环最快,或许颠覆你的认知

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

m0_59485658的博客 384

Open3D 曲率下采样

曲率下采样是一种基于几何特征的点云处理技术,通过计算每个点的曲率来判断其所在位置的局部表面特征,从而进行选择性保留。曲率的计算通常基于点的法向量和其邻域点的分布。

纵马踏花向自由 841

被骗了,原来让 Python 循环最快的方式,竟是不用循环?

不知道大家有没有考虑过,用循环与不用循环到底哪个速度快?什么原因导致速度快慢的呢?今天通过常用的循环来分析一下。 人生苦短,快学Python!众所周知,Python 不是一种执行效率较高的语言。此外在任何语言中,循环都是一种非常消耗时间的操作。假如任意一种简单的单步操作耗费的时间为 1 个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。while 和 for 是 Python 中常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码: 这是一个简单的求和操作,计算从 1

m0_59235945的博客 469

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

被骗了,原来让 Python 循环最快的方式,就是不用循环?

人生苦短,快学Python! 众所周知,Python 不是一种执行效率较高的语言。此外在任何语言中,循环都是一种非常消耗时间的操作。假如任意一种简单的单步操作耗费的时间为 1 个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。 while和for是 Python 中常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码: importtimeit defwhile_loop(n=100_000_000): i=0 s=0 ...

weixin_42686892的博客 265

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

佛学视角看电诈:一个细思极恐的事实是,骗子和被骗者,其实是同一类人,从零基础到精通,收藏这篇就够了!

当电信诈骗的新闻一次次冲击我们的视线时,愤怒、悲哀、同情轮番涌上心头,我们指责电诈者的无耻和冷酷,心疼被骗者的损失和痛苦之时,你是否想过,这两类看似完全是二元对立的人,其实在本质上是一类人?贪欲是一头无形的猛兽,它悄无声息地爬进人心,让人失去理智,甚至付出沉重的代价。电诈者和被骗者,其实都是贪欲的囚徒:一个用贪欲驱使他人,一个被贪欲控制自己。但在他们残酷的外表之下,驱使他们作恶的,正是对金钱的贪欲。这些骗局的共同点在于,利用人们对金钱、优惠、恐惧的渴望,让人来不及思考真相,只顾抓住眼前的“好处”。

Python_0011的博客 1423

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

学1个月爬虫就月赚6000?别被骗了,老师傅告诉你爬虫的真实情况!

你拿得出手的一些爬虫作品可能入不了大单金主的法眼,有时候接个技术难度高一点的,整出来效果都需要花费好几天,大多数初级爬虫的人接单都不会超过200块钱,大多数都是几十块钱的单子,月挣6000需要接多少单?从技术层面上来讲,接大点的单是没有问题的,一单的价格也是在300~几千不等,如果是均价600元一单来算,一个月做个四五单赚几千块钱是没问题的,拼一点或者技术好一点的可能赚得更多,前提是你得有这个技术,打脸充胖子是会翻船的。我觉得难度不小,我不说别的,就说Python入门这一块,就包含了不少的东西。

m0_60606468的博客 3095

一个能记住你一周前约球时间的开源 AI Agent,核心主循环只有 95 行 Python?

GitHub Trending 1200+ 星的开源项目 waku-agent,用「95 行主循环 + 记忆三支柱 + 检索门控 + 双轨 eval」这套组合,把一个本地优先的 AI Agent 拆到薄得能一个下午读完。本文只深挖一个话题:它怎么把大厂 Agent 藏着的东西全部摊上桌面——SQLite 单文件记忆、skip/retrieve 门控、deterministic 与 LLM-as-judge 分开测、以及 fail-open 的 Graph 分流。

weixin_49352169的博客 169

Python接单需要掌握哪些技能?这10个Python接单平台一定要收藏好!

如果你是个技术小白,安装 Python 环境可不是你的首要任务。现如今,相信很多职场朋友都非常羡慕程序员的高薪工作吧,很多学习计算机专业的大学生,他们在毕业以后,往往通过自己的专业就能找到互联网公司的高薪工作,而作为一名程序员,他们的工作压力还是非常大的,有时候经常熬夜加班,可是有些程序员也会在工作之余接一些私活,赚取零花钱。当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

m0_59236127的博客 1002

学1个月爬虫就月赚6000?别被骗了,老师傅告诉你爬虫的真实情况!(1)

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。,分流技术就得建池子,Cookies 池、Token 池、Sign 池,都可以,有了池子之后,你被封的概率也会降低,你也不想爬个公众号结果WX被封了吧?至于去哪接单已是老生常谈了,这里我就不多说了,自己去百度吧,百度什么都有,我们继续下面的话题,来看看爬虫的初级、中级、高级和巅峰水平是什么样子!工欲善其事必先利其器。

m0_60606468的博客 3174

如何用python画半圆,python如何画半圆

Python核心编程》电子版所以总的来讲,如果能跟书中一步一步学,或者是作为一种辅助的学习教材,或者是作为一种方向性的参考资料,都是非常适合的,而且从入门到进阶,基本上有这两本书就够了。学习编程不仅仅可以让你找到一份高薪的工作,而且如果你并不打算转行或者还在校学生的话,你可以考虑在网上接一些Python相关的小单子,不仅可以给自己练手,还能GPT改写。把我接私活的平台及方法分享给大家,希望能帮到一些想赚外快的朋友。一、程序员客栈。

obvo0607111的博客 1924
上一篇: 编程的本质是什么?为什么输入一堆英文就能让电脑各种应用动起来?
下一篇: 通过12个示例探索Python列表与索引的奥秘
普通网友
博客等级 码龄2年 86粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值