gpt4 book ai didi

python - python 中的生成器比 while 循环更快吗?

转载 作者:行者123 更新时间:2023-12-01 04:25:35 25 4
gpt4 key购买 nike

问题很简单,我有以下代码在 python2 中执行相同的操作:

for _ in range(n): # or xrange(),they have similar performance according to my test
pass

i = 0
while i < n:
i+=1
pass

for循环比while循环快,当n = 1000000时,每个循环大约需要0.105544和0.2389421

  1. 表面上看起来 while 循环正在执行增量边界检查,但据我所知,生成器或迭代器必须执行相同的数量那么,如果完成的工作相同,为什么一个比另一个更快呢?

来自python generator wiki

def generator(n):
i = 0
while i < n:
yield i
i += 1
  • 对于迭代器,通常有一个名为 next 的成员函数,每次调用它时,都会返回“可迭代对象中的下一项”,对我来说,这意味着大量函数调用,因此堆栈上有巨大的开销(更多的汇编代码来执行推送和弹出堆栈),并且根据我对协程(生成器)的了解,它试图规避通过创建一个新的独立堆栈(就像线程一样,它管理自己的程序计数器),虽然它不再处理大量的函数调用,但它承担着与线程相同的问题,即上下文切换的开销 .
    当 while 循环不面临我上面提到的任何开销时,它怎么会呢?
  • 最佳答案

    我预计您所看到的性能差异与代码的哪些部分是在 Python 中定义的以及哪些部分是在解释器内定义的(在 C 中,对于 cpython)有关。例如,在 for 循环情况下对 next 的调用将在 C 中处理,并且对于 range 或其他内置的在 iterable 中,函数的实现也将用 C 语言实现,因此速度可能会相当快。另一方面,while 循环的边界检查是一个 Python 表达式,需要在循环的每次传递中进行计算。 Python 代码几乎总是比 C 代码慢,因此在某些情况下 for 循环可能比 while 循环更快也就不足为奇了。

    但请注意,这两种循环可能比您在其中执行的任何有用工作都要快得多。几乎不值得将精力集中在像这样的不同类型循环之间非常小的性能差异上,而不是集中在算法的复杂性或数据结构的效率等更大的问题上。

    唯一的异常(exception)可能是,如果您对代码进行了大量分析并发现特定循环是特定程序的最大性能瓶颈。如果是这种情况,请根据您的喜好进行微优化。

    关于python - python 中的生成器比 while 循环更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201927/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com