代码之家  ›  专栏  ›  技术社区  ›  jxie0755

for循环vs.all()执行速度

  •  -1
  • jxie0755  · 技术社区  · 8 年前

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

    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 ,否则我会尝试 样本+=1 (代码省略)

    第二个代码段比第一个代码段慢两倍。 我不明白,当python计算all()时,如果 False 在迭代中发现,它应该立即返回 错误 for all(),而不是完成整个迭代,对吗?

    那么,为什么第二个代码段比第一个代码段慢呢?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Charles Duffy    8 年前

    以下是您的提示:

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

    您的代码正在创建genexp,并且需要 all 调用 next 方法在该genexp上反复执行。

    这将不可避免地对 for 不涉及函数调用的循环。另请参见 Python: Why is list comprehension slower than for loop