【问题标题】:Why is does a while loop take longer than a for loop?为什么while循环比for循环花费更长的时间?
【发布时间】:2019-07-06 00:06:14
【问题描述】:

编辑:我按照一些 cmets 所说的进行了多次测试。事实证明,在运行它们 10,000 次之后,while 循环会稍微快一些,这是有道理的。我的错。

我在 Python 中编写了两个最小公分母函数,一个使用 for 循环和三个导入,另一个使用一个 while 循环和一个导入。

# for loop
import sys
import operator as op
import functools as ft

def lcd(nums):
    if len(nums) < 2:
        return("Error: must be at least 2 numbers")
    elif 0 in nums:
        return("Error: cannot contain 0")
    else:
        nums = list(map(lambda x: abs(x), nums))
        highestLCD = ft.reduce(op.mul, nums) # multiply all nums together
        for i in range(max(nums),highestLCD,max(nums)):
            if all(i % n == 0 for n in nums):
                return i
        return highestLCD

if __name__ == "__main__":
    print(lcd([int(n) for n in sys.argv[1:]]))
# while loop
import sys

def lcd(nums):
    if len(nums) < 2:
        return("Error: must be at least 2 numbers")
    elif 0 in nums:
        return("Error: cannot contain 0")
    else:
        i = m = max(nums)
        while True:
            if all(i % n == 0 for n in nums):
                return i
            i += m

if __name__ == "__main__":
    print(lcd([int(n) for n in sys.argv[1:]]))

我预计 while 循环会更快,因为它的导入函数调用更少。

但是,在运行它们 1000 次之后,while 循环实际上慢了大约半秒到一整秒。

for

real    0m43.808s
user    0m29.016s
sys     0m10.164s
while

real    0m44.892s
user    0m29.528s
sys     0m10.565s

这是为什么?

【问题讨论】:

  • 这不是你的基准!您的测试规模很小。测试环境不相等。许多其他问题。
  • 请使用 timeit 重新运行这些测试并发布结果:docs.python.org/2/library/timeit.html
  • for 循环上还有一个明确的上限,而while 循环没有
  • Err ...如果您想比较 for/while 循环,您需要确保使用这些迭代的算法是相同的......不仅仅是相似,然后再确保您也可以猜一猜。(顺便说一句:在导入'dis'后,仔细看看将函数放入dis.dis)
  • @meissner_ 重点不是比较 while 循环和 for 循环,而是比较两种算法。使用 while 循环的那个被优化为使用 while 循环,而使用 for 循环的那个被优化为使用 for 循环。

标签: python performance for-loop while-loop


【解决方案1】:

看到这个答案:Why is looping over range() in Python faster than using a while loop?

似乎range() 使事情比 i+=1 更有效率。

【讨论】:

  • 谢谢!原来我只是没有进行足够的测试。 10,000 次表明 while 循环快了约 10/5/2 秒。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2013-06-28
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多