for循环与all()执行速度

时间:2018-03-17 21:13:10

标签: python for-loop

您好我认为下面的两个片段基本上应该做同样的事情:

for divisor in range(2, 21):
    if sample % divisor != 0:
        break

第一个片段,我使用sample除以2到20之间的数字,如果其中任何一个给出余数!= 0,那么我将break并尝试sample += 1(代码中省略)

if all(sample % divisor == 0 for divisor in range(2, n2+1)):
    return sample

第二个片段如果all()带回True,我将返回样本,否则我会尝试sample += 1(代码省略)

发现第二个片段比第一个片段慢两倍。我不明白,当python评估all()时,如果在迭代中找到一个False,它应该立即为所有()返回False,而不是完成整个迭代,对吗?

那么为什么第二个片段比第一个慢呢?

1 个答案:

答案 0 :(得分:4)

这是你的提示:

>>> (sample % divisor == 0 for divisor in range(2, n2+1))
<generator object <genexpr> at 0x10ead7a00>

您的代码正在创建一个genexp,并要求all一遍又一遍地调用该genexp上的next方法。

这比不涉及函数调用的for循环具有不可避免的性能损失。另请参阅Python: Why is list comprehension slower than for loop