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

如何通过缓存优化DataFrame的时间维度重复查询?

高效实现基于Time的DataFrame重复查询方案

方案1:提前GroupBy分组查询

利用pandas的groupby提前按time完成分组,后续查询直接通过get_group获取对应组,避免每次全表扫描:

# 提前预处理:按time分组,仅保留需要的列
time_groups = df[["id", "quantity", "time"]].groupby("time")

def query(time):
    return time_groups.get_group(time)
  • 优势:一次预处理,后续查询时间复杂度接近O(1),pandas内部对groupby做了优化,内存占用相对可控。
  • 适用场景:需要频繁查询不同time值,且DataFrame不会动态更新的场景。

方案2:字典缓存(最优查询性能)

直接将每个time对应的id-quantity片段预存到字典中,查询时直接通过键值对获取,是重复查询场景下性能最高的方式:

# 一次性构建缓存字典
time_cache = {
    time: group[["id", "quantity"]]
    for time, group in df.groupby("time")
}

def query(time):
    return time_cache[time]
  • 优势:哈希表直接访问,查询速度比groupby的get_group更快,省去了groupby内部的校验逻辑。
  • 注意:如果DataFrame后续有数据更新,需要同步更新缓存字典;若唯一time值极多,内存占用会略高于groupby方案,但10万行级数据完全可控。

方案3:索引优化查询

将time设为DataFrame的索引,利用pandas的索引快速定位功能:

# 提前构建索引化的DataFrame
df_indexed = df.set_index("time")[["id", "quantity"]]

def query(time):
    return df_indexed.loc[time]
  • 优势:实现简单,索引查找的性能远高于原方法的全表过滤;若需要同时进行其他基于time的操作(如排序、切片),索引化会更灵活。
  • 不足:查询性能略逊于前两种方案,因为loc需要在索引结构中定位,而非直接哈希访问。

性能对比

原方法每次查询都是全表扫描(O(n)时间),以上三种方案均为一次预处理+O(1)查询,在10万行数据的交替查询场景下,性能提升至少一个数量级。其中字典缓存方案的查询速度最快,适合高频重复查询的场景。

内容的提问来源于stack exchange,提问作者roulette01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:52:55