You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'}]

原代码核心问题:

  1. 时间复杂度极高:嵌套循环属于O(nm)量级,10万10万=1e10次操作,必然导致卡顿
  2. 逻辑错误:误用base_dict而非循环变量individual_dict_items,会导致所有基础数据的app3 vers被统一设置为最后一次匹配的值
  3. 匹配效率低:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:56:25