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

如何高效加速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}秒")

优化点说明

  1. 彻底抛弃循环:用Numpy广播实现批量运算,底层是C级别的高效计算,时间复杂度直接从O(M*N)降到O(M+N)
  2. 消除重复查找:提前把需要的列转为数组,一次性完成所有条件判断,完全去掉低效的index()线性查找
  3. 广播适配维度:通过[:, np.newaxis]将一维数组转为二维,实现行与列的元素级运算,无需手动循环
  4. 批量类型转换:布尔矩阵直接转int,替代逐行append的低效操作

额外建议

  • 如果df行数极大(10万+),可以考虑分块处理,但常规规模下上述代码能把耗时压缩到毫秒级
  • 永远优先用Pandas/Numpy的批量运算替代循环,这是这类工具的核心设计初衷

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:42:26