为何检查百万元素集合比判断单个值的执行速度更快?
Collatz猜想验证代码中判断条件变更导致性能暴跌的原因
我在测试验证1至100万数字是否符合Collatz猜想时,写出了最快版本v5,平均耗时1.104s,代码如下:
def v5(): # Avg t: 1.104s min_n = 1 max_n = 1_000_000 global_steps_list = {1, 2, 4} for n in range(min_n, max_n): steps_list = set() while True: if n in global_steps_list: global_steps_list.update(steps_list) break elif n % 2 == 0: n /= 2 else: n = 1 + (n * 3) steps_list.add(n)
但当我把判断条件if n in global_steps_list:(百万级集合)改成以下几种形式后,执行时间大幅飙升:
- 改为
if n == 4:,耗时31s - 改为
if n in {4},耗时37s - 预定义单元素集合
l = {4}后用if n in l:,耗时约42s
核心原因
原逻辑终止时机更早:
global_steps_list会持续记录所有已验证过的Collatz序列节点(包括中间值)。只要当前n属于这个集合,就能立刻终止循环——绝大多数数字不需要走完整个序列到4,中途遇到已记录的节点就会停止,迭代次数被大幅压缩。修改后逻辑终止时机极晚:三种修改后的判断条件,只有当
n等于4时才会终止循环。这意味着每个数字都必须完整走完Collatz序列直到降到4,迭代次数暴增数倍,直接导致总耗时飙升。单元素集合判断的额外开销:
n in {4}或n in l比n ==4更慢,是因为集合的in操作虽为O(1),但相比直接的整数相等判断,多了哈希计算、查找表访问等额外步骤;预定义集合l的耗时略高,还可能涉及变量查找的微小成本。
内容的提问来源于stack exchange,提问作者Perseus_Lynx
相关产品推荐
相关产品推荐

