如何优化日志表最新可用项判定的循环逻辑以提升处理速度?
提升变更日志表可用项的处理速度
问题场景
有一张记录数据变更的日志表,规则如下:
+表示添加项,-表示删除项- 项由
First和Last列的组合唯一标识 - 需按
Date和Change排序后,筛选出当前可用的项:仅当项的最后一次变更符号为+时表示可用(如序列+、+-+、-+均为可用,-、++-为不可用)
原始实现采用逐行迭代处理,在大数据量下(如5万条重复数据)耗时长达20秒,性能极低:
latest = {} item_columns = ["First", "Last"] for _, row in history.iterrows(): key = tuple(row[column] for column in item_columns) if row["Change"] == "+": latest[key] = row elif row["Change"] == "-" and key in latest: del latest[key] available = pd.DataFrame(latest.keys(), columns=item_columns)
优化方案
利用Pandas的矢量化操作替代逐行循环,底层基于C实现,可大幅提升处理速度。以下两种方法均能实现需求,且性能差异极小:
方法1:分组取最后一条记录
通过groupby按项分组,直接获取每组的最后一条记录(因已按时间排序,最后一条即为最新变更),再筛选出变更符号为+的项:
# 按First+Last分组,取每组最后一条记录 latest_changes = history.groupby(['First', 'Last'], as_index=False).last() # 筛选最后一次变更为+的可用项 available = latest_changes[latest_changes['Change'] == '+'][['First', 'Last']]
方法2:去重保留最后一条记录
使用drop_duplicates保留每个First+Last组合的最后一次出现,再筛选可用项:
# 保留每个项的最后一条变更记录 latest_changes = history.drop_duplicates(subset=['First', 'Last'], keep='last') # 筛选可用项 available = latest_changes[latest_changes['Change'] == '+'][['First', 'Last']]
效果验证
两种优化方法的输出结果与原始逻辑完全一致:
First Last 0 X Y 1 Y Y
且处理5万条数据的耗时可降至毫秒级,性能提升显著。
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

