You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何筛选1000以内素数的列表推导式运行速度远慢于普通Python代码

问题原因分析

你观察到的速度差异不是列表推导式本身性能比普通循环差,本质是两种写法的执行逻辑完全不同:
你写的原始列表推导式中,生成合数列表的子推导[y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]放在了if判断的条件内,Python会在遍历每一个待判断的x时,都完整重新执行一遍这个子推导生成全新的合数列表。2到999共有998个待判断的数,相当于你重复生成了998次合数列表,运算量直接翻了近千倍,自然耗时极长。
而你写的普通循环代码仅在最开始生成1次合数列表,后续所有not in判断都复用这个已生成的列表,总运算量只有原始列表推导式的近千分之一,所以可以瞬间执行完成。

优化方案(仅使用列表推导式实现)

优化核心是让合数列表在列表推导式内仅生成1次,复用给所有x的判断逻辑,不需要额外声明外部变量,写法如下:

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

实现逻辑是:第一层for循环遍历的是仅包含1个元素的列表(元素就是生成的合数列表),仅执行1次就完成了合数列表的生成并赋值给composite变量,后续遍历x做判断时直接复用这个已生成的composite,不会重复生成合数列表,运行速度和普通循环完全一致。

如果可以接受将合数转为集合进一步优化查询速度(列表的in查询时间复杂度是O(n),集合是O(1)),可以用下面的写法,速度会更快:

print([x for composite in [set(y * z for y in range(2, 1001) for z in range(2, 1001) if y * z < 1000)] for x in range(2, 1000) if x not in composite])

内容的提问来源于stack exchange,提问作者user15464781

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:54:04