首页 > 解决方案 > 列表理解的加载时间比执行相同操作的常规代码慢得多

问题描述

我有一个列表理解,可以打印从 1 到 1000 的所有素数。出于某种奇怪的原因,我的列表理解需要 1:46 才能加载到终端中。我觉得这很奇怪,因为当我正常编写相同的代码时,它会立即加载。

这是我的理解:print([x for x in range(2, 1000) if x not in [y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]]) 如您所见,它列出了 2 和 1000 的数字列表,并打印不在 1000 以下的合数列表中的(素数)。当我运行它时,它会正确输出,但需要我尝试的每台计算机上的年龄。我想也许我的代码只是错误的。但是,当我隔离[y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]线时,显示复合材料没有延迟。当我生成常规的数字列表进行比较时,也没有滞后。只是当我使用“不在”运算符时,理解需要很长时间才能打印出来。

我想也许不是比较慢。但令我沮丧的是,我注意到当我正常而不是理解地写出代码的比较部分时,绝对没有延迟。看到这个:

x = [y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]
newlist = []
for z in range(2, 1000):
  if z not in x:
    newlist.append(z)
print(newlist)

如您所见,我将复合列表放入一个变量中,并定期执行 if 语句和循环。如果 x 不在列表中,则将其添加到新列表中。实现我的列表理解的相同目标。我想知道,如果我的列表理解如此缓慢,是否有解决方案。逻辑与我最初的理解相匹配,那么如果基本相同,为什么理解格式需要更长的时间?

请尽量不要在我的代码中添加任何附加功能,我将尝试使用列表理解并且仅使用列表理解。

标签: pythonlist

解决方案


每次迭代都会重新创建内部列表x。简单地把它分开:

composites = [y*z for y in range(2, 1001) for z in range(2, 1001) if y*z < 1000]
[x for x in range(2, 1000) if x not in composites]

顺便说一句,如果您进行composites设置,查找 (innot in) 会快得多(O(1)而不是O(n),其中n=len(composites))。

composites = {y*z for y ...}

推荐阅读