如何通过缓存优化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
相关产品推荐
相关产品推荐

