Python字典列表字段匹配性能优化:百万级CSV数据高效合并方案
性能优化方案:字典列表高效合并匹配
问题背景
你有两个各含10万行数据的字典列表(来自CSV),需要根据ID将参考数据中的app3 vers字段合并到基础数据中:有效取值直接填充,空值或无匹配时填充'Not Present'。原嵌套循环代码测试可用,但处理真实数据耗时35分钟,需要优化。
参考数据样例:
[{'ID': 'A1', 'app3 vers': '8'}, {'ID': 'A2', 'app3 vers': ''}]
基础数据样例:
[{'ID': 'A1', 'app1 vers': '4', 'app2 vers': '3'}, {'ID': 'A2', 'app1 vers': '2', 'app2 vers': '4'}]
原代码核心问题:
- 时间复杂度极高:嵌套循环属于O(nm)量级,10万10万=1e10次操作,必然导致卡顿
- 逻辑错误:误用
base_dict而非循环变量individual_dict_items,会导致所有基础数据的app3 vers被统一设置为最后一次匹配的值 - 匹配效率低:用
currentid in ref_dicts.values()遍历字典值,比直接取ref_dicts['ID']对比慢很多
优化思路
把参考数据转换成以ID为键的映射字典,将单次匹配的时间复杂度从O(m)降到O(1),整体时间复杂度变为O(n+m),处理10万级数据仅需几秒。
优化后代码
第一步:预处理参考数据,构建ID映射
先把参考数据转换成ID到app3 vers的映射,同时提前处理空值:
# 用字典推导式快速构建ID映射,空值直接替换为'Not Present' ref_id_map = { item['ID']: item['app3 vers'].strip() if item['app3 vers'].strip() else 'Not Present' for item in reference_data_list }
注:
.strip()用来处理可能的空格空值,不需要的话可以去掉
第二步:遍历基础数据批量填充
直接通过ID从映射中取值,无需嵌套循环:
for base_item in list_of_base_dicts: # 用get方法:存在ID则取对应值,不存在则用默认的'Not Present' base_item['app3 vers'] = ref_id_map.get(base_item['ID'], 'Not Present')
额外说明
- 该方案既解决了性能问题,还修复了原代码中误修改全局
base_dict的逻辑错误 - 如果CSV文件本身超大,建议用
csv.DictReader逐行处理,避免一次性加载所有数据到内存(10万行数据内存完全可以承载)
内容的提问来源于stack exchange,提问作者Dan S
相关产品推荐
相关产品推荐

