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

如何优化日志表最新可用项判定的循环逻辑以提升处理速度?

提升变更日志表可用项的处理速度

问题场景

有一张记录数据变更的日志表,规则如下:

  • + 表示添加项,- 表示删除项
  • 项由 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:43:13