实现双射映射:单n大小字典与两个n/2大小字典的迭代性能对比
双射映射两种字典实现方案的性能对比
结论很明确:这两种方案性能不等效,方案2的性能会比方案1差,尤其是在键不存在的场景下。
核心原因
- 字典的
in操作本身是O(1)复杂度,但方案2需要触发两次__contains__方法调用。哪怕单次调用的辅助开销极小,两次叠加的成本也会超过方案1的单次调用。 - 当待检查的键不存在时,方案2必须完整执行两次
in检查(因为or逻辑会先判断第一个字典,结果为假后才会去检查第二个),此时的开销几乎是方案1的两倍。 - 就算键存在且刚好在第一个字典d1中,方案2也多了一层
or的逻辑分支判断,相比方案1直接一次in调用,还是会产生额外的性能损耗。
实际测试验证
可以用Python的timeit模块做简单的性能对比:
import timeit # 测试单字典场景 def test_single_dict(n): d = {i: i for i in range(n)} def check_key(): # 检查一个不存在的键,模拟最坏场景 return 9999999 in d return check_key # 测试双字典场景 def test_two_dicts(n): half = n // 2 d1 = {i: i for i in range(half)} d2 = {i: i for i in range(half, n)} def check_key(): return 9999999 in d1 or 9999999 in d2 return check_key # 初始化百万级数据 n = 1000000 # 执行10万次检查 print("单字典耗时:", timeit.timeit(test_single_dict(n), number=100000)) print("双字典耗时:", timeit.timeit(test_two_dicts(n), number=100000))
运行结果会显示,双字典方案的耗时显著高于单字典方案,尤其是在键不存在的测试场景下。
总结
如果优先考虑性能,方案1是更合理的选择。方案2不仅没有性能优势,反而会因为额外的方法调用和逻辑判断,带来不必要的性能损耗。
内容的提问来源于stack exchange,提问作者Michael Moreno
相关产品推荐
相关产品推荐

