高频更新场景下检查字典列表、避免添加重复数据的最快方法
高性能部分校验去重方案
针对你的高频更新、仅需校验最近历史条目的场景,最优实现是采用定长窗口哈希校验方案,性能远高于遍历最后25条的实现,单次校验耗时稳定在O(1)级别,完全不受全量列表长度影响。
核心逻辑
你的重复条目仅会出现在回滚时间对应的最近N条范围内,因此不需要维护全量数据的哈希,仅需缓存最近25条(可根据回滚时长调整)的唯一标识即可:
- 先确定条目的唯一键组合:你的场景下
contract_id+value_at+metric三个字段可唯一标识一条数据,不会出现同合约、同时间、同指标对应不同值的情况。 - 维护两个辅助结构:定长队列控制缓存的键数量,哈希集合做O(1)的重复校验。
实现代码
import datetime from decimal import Decimal from collections import deque # 业务数据存储列表,最终可直接转DataFrame data_list = [] # 定长队列,最多保留最近25条的唯一键,可根据回滚时长调整maxlen key_queue = deque(maxlen=25) # 哈希集合,用于快速校验重复 recent_unique_keys = set() def add_new_item(new_item: dict) -> bool: # 生成可哈希的唯一键,可根据业务调整字段组合 unique_key = ( new_item["contract_id"], new_item["value_at"], new_item["metric"] ) # 重复校验,O(1)耗时 if unique_key in recent_unique_keys: return False # 新增非重复数据 data_list.append(new_item) # 更新键缓存 key_queue.append(unique_key) recent_unique_keys.add(unique_key) # 队列满时清理最早的旧键,避免集合无限膨胀 if len(key_queue) == 25: old_key = key_queue[0] recent_unique_keys.discard(old_key) return True
方案优势
- 性能远高于遍历最后N条的实现:哈希查找的耗时稳定在微秒级,哪怕每秒更新上千次也不会有性能瓶颈
- 内存占用极低:仅存储25个元组的缓存,几乎可以忽略不计
- 扩展性强:如果后续回滚时长增加,仅需调整
deque的maxlen参数即可,性能不受影响
内容的提问来源于stack exchange,提问作者Mat90
相关产品推荐
相关产品推荐

