从大型字典生成子字典:复制后删键与按需填充哪种时间效率更高
Python两种生成子字典方案的时间效率对比
结论先行:你的初始判断完全正确,方案二的时间效率远高于方案一,不存在反直觉的性能表现
两个方案的底层开销拆解
- 方案一(全量复制后删除冗余)
- 第一步复制原始字典时,就需要遍历全部3000+键值对完成全量拷贝,已经产生了全量遍历开销
- 第二步需要遍历2400+多余的键逐个执行
del操作,每次删除都要触发哈希表查找、标记删除、哈希表重整等额外逻辑,额外开销极高 - 总核心操作数约为5400次,是方案二的数倍到十数倍
- 方案二(仅提取目标键生成新字典)
- 仅需要遍历你需要的300~600个目标键,每个键仅做1次原始字典查找+1次新字典赋值即可
- 总核心操作数仅300~600次,完全没有冗余操作
实际测试参考
你可以用以下代码在本地实测性能差异:
import timeit # 构造3000键的测试原始字典 origin_dict = {i: f"value_{i}" for i in range(3000)} # 选取500个目标键模拟常见场景 target_keys = list(range(500)) def method_copy_del(): # 方案一:复制后删除冗余 temp = origin_dict.copy() for k in list(temp.keys()): if k not in target_keys: del temp[k] return temp def method_pick_target(): # 方案二:直接提取目标键值对 return {k: origin_dict[k] for k in target_keys} # 执行1000次的耗时对比 print("方案一1000次耗时:", timeit.timeit(method_copy_del, number=1000)) print("方案二1000次耗时:", timeit.timeit(method_pick_target, number=1000))
常规环境下的测试结果为方案一耗时是方案二的8~12倍,和开销拆解的结论完全吻合。
补充优化点
如果存在目标键不在原始字典的场景,可以加一层存在性判断,修改为{k: origin_dict[k] for k in target_keys if k in origin_dict},即使增加了判断逻辑,整体耗时仍然远低于方案一。
内容的提问来源于stack exchange,提问作者Arman Mojaver
相关产品推荐
相关产品推荐

