Python统计JSON元素并去重代码处理大量数据效率低,求优化方案
性能问题根源
- 你现有代码的时间复杂度为O(n²):每次循环调用
list.count()都要遍历一次全列表,嵌套遍历下数据量越大耗时增长越快 - 逻辑冗余:统计阶段没有做去重,生成的BattleAmount仍存在重复项,需要二次遍历做去重,多了一轮O(n²)的开销
- 不必要的重复深拷贝开销:每遍历一个元素就执行一次
copy.deepcopy(),也会拖慢执行速度
优化实现方案
用哈希表(Python字典)做单次遍历统计,时间复杂度降到O(n),适配大数据量场景:
import json import copy def process_battle_data(DATA): count_map = {} # 第一次遍历完成统计,仅做必要深拷贝 for item in DATA: # 把字典转为可哈希的字符串作为键,sort_keys保证相同结构内容的字典生成相同字符串 item_key = json.dumps(item, sort_keys=True) if item_key not in count_map: # 仅第一次遇到该元素时做深拷贝,存储原始值和计数 count_map[item_key] = { "data": copy.deepcopy(item), "cnt": 0 } count_map[item_key]["cnt"] += 1 # 一步生成去重后的统计列表和重复项列表 BattleAmount = [] duplicates = [] for val in count_map.values(): processed_item = val["data"] processed_item["md"]["amount"] += val["cnt"] BattleAmount.append(processed_item) if val["cnt"] > 1: duplicates.append(processed_item) print("Number of BattleAmount are ", len(BattleAmount)) return BattleAmount, duplicates
额外优化建议
- 如果仅需要根据指定字段判断重复(比如不需要对比整个JSON的所有字段,只对比
md的mana、rule_set和team的关键字段),可以自行构造键值,不需要序列化整个字典,执行速度会更快 - 如果数据量特别大(十万级以上),可以考虑用
ujson代替标准库的json做序列化,速度提升明显
内容的提问来源于stack exchange,提问作者Ruzaini Subri
相关产品推荐
相关产品推荐

