0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python哪种方式循环最快呢?

新机器视觉 来源:StarryLand 2023-04-01 09:32 次阅读

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

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

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whilei< 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		', timeit.timeit(while_loop, number=1))
    print('for loop		', timeit.timeit(for_loop, number=1))


if __name__ == '__main__':
    main()
# =>whileloop4.718853999860585
#=>forloop3.211570399813354

这是一个简单的求和操作,计算从 1 到 n 之间所有自然数的总和。可以看到for循环相比while要快 1.5 秒。

其中的差距主要在于两者的机制不同。

在每次循环中,while实际上比for多执行了两步操作:边界检查和变量i的自增。即每进行一次循环,while 都会做一次边界检查 (while i < n)和自增计算(i +=1)。这两步操作都是显式的纯 Python 代码。

for循环不需要执行边界检查和自增操作,没有增加显式的 Python 代码(纯 Python 代码效率低于底层的 C 代码)。当循环的次数足够多,就出现了明显的效率差距。

可以再增加两个函数,在for循环中加上不必要的边界检查和自增计算:

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whilei< 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		', timeit.timeit(while_loop, number=1))
    print('for loop		', timeit.timeit(for_loop, number=1))
    print('for loop with increment		',
          timeit.timeit(for_loop_with_inc, number=1))
    print('for loop with test		', timeit.timeit(for_loop_with_test, number=1))


if __name__ == '__main__':
    main()
# =>whileloop4.718853999860585
#=>forloop3.211570399813354
#=>forloopwithincrement4.602369500091299
#=>forloopwithtest4.18337869993411

可以看出,增加的边界检查和自增操作确实大大影响了for循环的执行效率。

前面提到过,Python 底层的解释器和内置函数是用 C 语言实现的。而 C 语言的执行效率远大于 Python。

对于上面的求等差数列之和的操作,借助于 Python 内置的sum函数,可以获得远大于for或while循环的执行效率。

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whilei< 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		', timeit.timeit(while_loop, number=1))
    print('for loop		', timeit.timeit(for_loop, number=1))
    print('sum range		', timeit.timeit(sum_range, number=1))


if __name__ == '__main__':
    main()
# =>whileloop4.718853999860585
#=>forloop3.211570399813354
#=>sumrange0.8658821999561042

可以看到,使用内置函数sum替代循环之后,代码的执行效率实现了成倍的增长。

内置函数sum的累加操作实际上也是一种循环,但它由 C 语言实现,而for循环中的求和操作是由纯 Python 代码s += i实现的。C > Python。

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

importtimeit


defwhile_loop(n=100_000_000):
i=0
s=0
whilei< 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		', timeit.timeit(while_loop, number=1))
    print('for loop		', timeit.timeit(for_loop, number=1))
    print('sum range		', timeit.timeit(sum_range, number=1))
    print('math sum		', timeit.timeit(math_sum, number=1))


if __name__ == '__main__':
    main()
# =>whileloop4.718853999860585
#=>forloop3.211570399813354
#=>sumrange0.8658821999561042
#=>mathsum2.400018274784088e-06

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

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

最后的结论(有点谜语人):

实现循环的最快方式—— —— ——就是不用循环

对于 Python 而言,则尽可能地使用内置函数,将循环中的纯 Python 代码降到最低。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128943
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83480

原文标题:Python 哪种方式循环最快,或许颠覆你的认知!

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文详解python循环

    今天给大家带来python循环
    发表于 10-01 10:48 357次阅读
    一文详解<b class='flag-5'>python</b><b class='flag-5'>循环</b>

    python for循环

    python for循环for 循环可以遍历任何序列的项目,如一个列表或者一个字符串。它的基本语法是for 元素 in 序列对象:1. 普通循环直接上案例>>> phones
    发表于 02-25 16:28

    python while循环

    python while循环while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:while 判断条件: 执行语句1. 普通的
    发表于 02-28 16:40

    Python for、while 等循环速度对比

    的结论(有点谜语人):实现循环最快方式—— —— ——就是不用循环对于 Python 而言,则尽可能地使用内置函数,将
    发表于 03-25 16:05

    详解Python的for和while循环

    Python 的 for 和 while 循环是灵活并且高级的,语法自然、读起来像伪代码。而 Cython 也支持 for 和 while,无需修改。但由于循环通常占据程序运行时的大部分时间,因此我们可以通过一些优化,确保 Cy
    的头像 发表于 06-24 16:02 1237次阅读

    Python的while循环是什么

    Python中有2种循环。一种循环次数明确,另一种循环次数不明确。`for循环`的循环重复次数是
    的头像 发表于 02-23 11:15 814次阅读

    Python中的while循环结构

    Python 中,while 循环是一种重复执行代码块的结构,只要指定的条件为 True,就会继续执行。
    的头像 发表于 04-19 15:44 1253次阅读

    Python中的for循环结构

    Python 中,for 循环是一种常用的结构,用于遍历序列(如列表、元组、字符串)中的元素。
    的头像 发表于 04-19 15:45 1678次阅读

    详解Python中的while循环

    说起编程语言中的循环,一般 for 循环用的时候比较多,因为相比于 while 循环,for 循环的代码量更少。不过有时候也会用到 while 循环
    的头像 发表于 04-26 17:55 1077次阅读

    Python循环语句介绍

    哈喽大家好,我是知道。今天带大家了解下Python循环语句 定义循环语句允许我们执行一个语句或语句组多次 类型Python提供了两种不同类型的循环
    的头像 发表于 05-11 17:39 650次阅读

    python最简单for循环例子

    Python是一种简单而又强大的编程语言,通过其清晰的语法和丰富的功能库,我们可以实现各种各样的任务。其中一个最基本的语法结构就是for循环,让我们来看一下如何使用for循环来编写一个最简单的例子
    的头像 发表于 11-21 14:53 498次阅读

    python循环里的输出结果汇总

    循环是计算机编程中常用的一种控制结构,用于重复执行一段代码。Python提供了多种类型的循环结构,包括for循环和while循环。在这篇文章
    的头像 发表于 11-22 09:59 764次阅读

    python循环创建变量并赋值

    循环Python编程中非常重要的一个概念,它可以让我们轻松地重复执行某些代码块,从而简化编程过程并提高代码的效率。在循环中,我们经常需要创建变量并赋值,这是非常常见的操作。接下来,我将详尽地解释
    的头像 发表于 11-23 14:51 649次阅读

    python怎么设置循环次数

    Python中,可以使用循环语句来重复执行一段代码多次。要设置循环次数,可以使用循环的计数器来控制循环的执行次数。以下是几种常用的设置
    的头像 发表于 11-23 15:50 1984次阅读

    python如何一直循环一个代码

    Python中,有几种方法可以实现代码的循环执行。下面我将详尽、详实、细致地介绍这些方法和它们的使用情况。 使用while循环: 在Python中,可以使用while
    的头像 发表于 11-23 15:54 883次阅读