如何优化大规模数据集下停车场离场时Occupancy计算效率?
优化大规模数据集下停车场离场时占用数计算方案
原实现的问题
你的当前代码采用循环遍历每个离场时间,每次循环都对全表执行查询,时间复杂度为O(n²)。对于数十万行的数据集,这种方法会产生亿级别的操作量,导致处理耗时极长。
优化思路:向量化+二分查找
利用事件点统计的思路,将问题转化为:对于每个离场时间t,停车场的占用数 = 「入场时间早于t的车辆总数」 - 「离场时间早于t的车辆总数」。这个逻辑和你原查询的结果完全一致(原查询统计的是入场早于t且离场不早于t的车辆数,等价于总入场数减去已离场数)。
通过排序+二分查找(numpy.searchsorted)可以实现O(n log n)的时间复杂度,大幅提升处理速度。
优化代码实现
import pandas as pd import numpy as np def get_occ_optimized(df): # 确保日期列是datetime类型(如果还不是的话) df['ENTRY DATE'] = pd.to_datetime(df['ENTRY DATE']) df['EXIT DATE'] = pd.to_datetime(df['EXIT DATE']) # 提取时间数组并排序 entry_times = df['ENTRY DATE'].values exit_times = df['EXIT DATE'].values sorted_entries = np.sort(entry_times) sorted_exits = np.sort(exit_times) # 用二分查找计算每个离场时间对应的计数 # 统计入场时间 < 当前离场时间的车辆数 count_entry = np.searchsorted(sorted_entries, exit_times, side='left') # 统计离场时间 < 当前离场时间的车辆数 count_exit = np.searchsorted(sorted_exits, exit_times, side='left') # 计算占用数并赋值 df['OCCUPANCY'] = count_entry - count_exit return df
代码解释
- 类型转换:确保日期列是
datetime类型,避免字符串比较的性能损耗和错误。 - 排序:对所有入场、离场时间排序,为二分查找做准备。
- 二分查找:
np.searchsorted(sorted_entries, exit_times, side='left'):找到每个离场时间在排序后的入场时间数组中第一个大于等于它的位置,这个位置值就是入场时间早于该离场时间的车辆总数。np.searchsorted(sorted_exits, exit_times, side='left'):同理,得到离场时间早于当前离场时间的车辆总数。
- 计算占用数:用总入场数减去已离场数,得到当前离场时刻的停车场占用数,和原逻辑结果完全一致。
性能对比
对于10万行的数据集,原循环方法可能需要数十分钟甚至更久,而优化后的方法仅需数秒即可完成计算。
内容的提问来源于stack exchange,提问作者Mr.Oz
相关产品推荐
相关产品推荐

