如何高效加速Pandas循环?现有代码优化求助
代码优化方案:从78秒到毫秒级提速
原代码核心性能问题
- 嵌套循环导致**O(M*N)**时间复杂度(M=8760,N为df行数),完全浪费了Pandas的向量化运算优势
- 频繁调用
list.index()做线性查找,重复计算大幅拖慢速度 - 逐行操作DataFrame,行级操作本身就远慢于批量运算
优化思路:向量化+广播运算
利用Pandas/Numpy的广播机制,把嵌套循环转化为矩阵级批量运算,一次性完成所有判断。
优化后的代码
import pandas as pd import numpy as np from time import process_time # 保留原数据初始化逻辑 daten={'Contract':Contract_Name,'Product':Products,'Relative':Relative_Name,'Start_Date':Start_Dates,'End_Date':End_Dates,'Relevant':Relevant, 'Volume':Volumes,'Hours':Hours} df=pd.DataFrame(daten) pt = process_time() # 日期转换仅执行一次 df['Start_Date']=pd.to_datetime(df['Start_Date']) df['End_Date']=pd.to_datetime(df['End_Date']) h_prof['DeliveryStart']=pd.to_datetime(h_prof['DeliveryStart']) # 提取关键列并转为Numpy数组,提升运算效率 df_start = df['Start_Date'].to_numpy() df_end = df['End_Date'].to_numpy() is_bunn = (df['Product'] == 'bunn').to_numpy() h_delivery = h_prof['DeliveryStart'].to_numpy() is_p_op_p = (h_prof['P_OP'] == 'P').to_numpy() # 广播生成日期范围判断矩阵:8760行 × df列数 date_match = (df_start <= h_delivery[:, np.newaxis]) & (df_end >= h_delivery[:, np.newaxis]) # 广播生成两个条件矩阵,适配日期矩阵维度 product_match = is_bunn[np.newaxis, :] p_op_match = is_p_op_p[:, np.newaxis] # 最终判断:日期匹配 且 (产品为bunn 或 P_OP为P),转int得到0/1矩阵 Matrix = ((date_match) & (product_match | p_op_match)).astype(int) print(f"优化后耗时: {process_time() - pt:.2f}秒")
优化点说明
- 彻底抛弃循环:用Numpy广播实现批量运算,底层是C级别的高效计算,时间复杂度直接从O(M*N)降到O(M+N)
- 消除重复查找:提前把需要的列转为数组,一次性完成所有条件判断,完全去掉低效的
index()线性查找 - 广播适配维度:通过
[:, np.newaxis]将一维数组转为二维,实现行与列的元素级运算,无需手动循环 - 批量类型转换:布尔矩阵直接转int,替代逐行append的低效操作
额外建议
- 如果df行数极大(10万+),可以考虑分块处理,但常规规模下上述代码能把耗时压缩到毫秒级
- 永远优先用Pandas/Numpy的批量运算替代循环,这是这类工具的核心设计初衷
内容的提问来源于stack exchange,提问作者cJc
相关产品推荐
相关产品推荐

