您好我认为下面的两个片段基本上应该做同样的事情:
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
,而不是完成整个迭代,对吗?
那么为什么第二个片段比第一个慢呢?
答案 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