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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:45:06