You need to enable JavaScript to run this app. 从大型字典生成子字典:复制后删键与按需填充哪种时间效率更高
优惠活动
大模型
产品
解决方案
定价
更多

从大型字典生成子字典:复制后删键与按需填充哪种时间效率更高

Python两种生成子字典方案的时间效率对比

结论先行:你的初始判断完全正确,方案二的时间效率远高于方案一,不存在反直觉的性能表现

两个方案的底层开销拆解

  • 方案一(全量复制后删除冗余)
    1. 第一步复制原始字典时,就需要遍历全部3000+键值对完成全量拷贝,已经产生了全量遍历开销
    2. 第二步需要遍历2400+多余的键逐个执行del操作,每次删除都要触发哈希表查找、标记删除、哈希表重整等额外逻辑,额外开销极高
    3. 总核心操作数约为5400次,是方案二的数倍到十数倍
  • 方案二(仅提取目标键生成新字典)
    1. 仅需要遍历你需要的300~600个目标键,每个键仅做1次原始字典查找+1次新字典赋值即可
    2. 总核心操作数仅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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 15:15:03