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

如何提升大型DataFrame中rolling.apply(func)的执行效率?

优化Pandas Rolling窗口自定义EWM标准差的性能问题

问题背景

处理规模约500×10000的DataFrame时,用20个线程并行执行rolling(window=255).apply(ewm_std),速度严重不达预期。现有代码如下:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=20) as executor:
     for value in myList:
          executor.submit(myFunc, value)
    
def myFunc(value):
     # 其他逻辑
     df[value].rolling(window=255).apply(ewm_std)
    
def ewm_std(x):
     # 自定义EWM标准差实现
     ...

关键优化点:替换自定义函数为原生实现

rolling.apply调用Python自定义函数时,会逐窗口执行Python代码,效率极低。改用Pandas原生的EWM标准差方法,依托底层C优化,能大幅提升速度:

  • 使用pandas.Series.ewm直接计算(若业务逻辑允许等价替换)
  • 或在rolling窗口内调用原生EWM方法

优化后代码示例

def myFunc(value):
     # 其他逻辑
     # 方案1:rolling窗口内应用原生EWM计算,raw=True减少类型转换开销
     result = df[value].rolling(window=255).apply(lambda x: x.ewm(adjust=False).std(), raw=True)
     # 方案2:直接使用EWM的滑动窗口逻辑(需确认业务规则是否匹配)
     result = df[value].ewm(span=255, adjust=False).std()

额外性能调优建议

  • 线程数合理设置:Python受GIL限制,CPU密集型任务线程数不宜超过CPU核心数的2倍,过多线程会增加调度开销,反而降低效率。
  • 避免DataFrame共享竞争:确保每个线程处理的列独立,必要时使用局部副本,减少锁竞争。
  • 批量处理列:若myList是列名集合,可尝试一次处理多列,减少线程启动和调度的开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:35:21