python - 列表理解的加载时间比执行相同操作的常规代码慢得多
问题描述
我有一个列表理解,可以打印从 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 不在列表中,则将其添加到新列表中。实现我的列表理解的相同目标。我想知道,如果我的列表理解如此缓慢,是否有解决方案。逻辑与我最初的理解相匹配,那么如果基本相同,为什么理解格式需要更长的时间?
请尽量不要在我的代码中添加任何附加功能,我将尝试使用列表理解并且仅使用列表理解。
解决方案
每次迭代都会重新创建内部列表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
设置,查找 (in
和not in
) 会快得多(O(1)而不是O(n),其中n=len(composites))。
composites = {y*z for y ...}
推荐阅读
- javascript - JS/PHP:在 Outlook 中撰写电子邮件并添加附件
- google-cloud-platform - 谷歌计算引擎,附加磁盘不工作
- javascript - Javascript 文件中 require() 的范围
- r - 从页面抓取数据
- data-mining - 如果使用 Apriori 算法后只有可能的候选 1-Itemsets,那么强关联规则是什么?
- c# - 当 SQL 显示 34 行时,ASP.Net 网格视图仅显示 1 个结果
- angular - 如何将 Angular Material 表列标题和 mat-cell 内容居中
- extjs - 如何在 textarea ExtJS 中绑定数据
- python - 如何在 Python 中打开以注释开头的 LaTeX 文件
- styled-components - 样式化组件 - 对象不支持属性或方法“ToString”