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

如何优化Pandas DataFrame行级Numpy FFT去噪的执行速度?

批量对DataFrame行执行FFT去噪的性能优化方案

这是某问题的跟进提问:我拥有多个大型Pandas DataFrame,需要对每行单独应用Numpy的FFT函数进行去噪处理。当前通过遍历DataFrame的行执行操作,代码如下:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10000, 52), columns=range(1,53))

output = np.empty((0,52))

for index, row in df.iterrows():
    spectrum = np.fft.rfft(row)
    spectrum[6:] = 0
    verified = np.fft.irfft(spectrum)
    output = np.vstack((output, verified))

这段脚本在设备上需耗时5-6秒,由于有数百个类似DataFrame需要处理,整体耗时会非常久,希望找到对整个DataFrame直接应用FFT或其他提升执行速度的方法。


核心优化:用Numpy向量化操作替代逐行遍历

Numpy的FFT系列函数原生支持多维数组的按轴批量运算,不需要逐行循环,直接对DataFrame的底层数组操作即可,性能提升非常显著。

优化后的代码

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10000, 52), columns=range(1,53))

# 按行执行FFT变换(axis=1指定沿列的方向,即每行作为一个独立序列)
spectrum = np.fft.rfft(df.values, axis=1)
# 保留前6个频率分量,其余置0实现去噪
spectrum[:, 6:] = 0
# 逆变换回时域信号
output = np.fft.irfft(spectrum, axis=1)
# 可选:将结果转回DataFrame格式
output_df = pd.DataFrame(output, columns=df.columns)

性能提升的关键原因

  • 消除Python循环开销:iterrows()会逐行生成Series对象,带来大量Python层面的循环损耗;而向量化操作在C底层执行,效率是循环的数十倍。
  • 避免内存重复分配:原代码中np.vstack()每次循环都会重新分配内存并复制数据,而向量化操作一次性完成内存分配与运算,内存利用率更高。

额外优化建议

  • 直接操作Numpy数组:如果后续业务不需要DataFrame的结构,直接处理df.values(或df.to_numpy()),减少DataFrame与数组的转换开销。
  • 预分配内存的循环写法:如果有更复杂的行级逻辑必须用循环,提前分配好输出数组的内存,避免动态扩展:
    output = np.empty_like(df.values)
    for i in range(df.shape[0]):
        row_spec = np.fft.rfft(df.values[i])
        row_spec[6:] = 0
        output[i] = np.fft.irfft(row_spec)
    
    这种写法比iterrows()+vstack()快很多,因为避免了Series对象的创建和内存动态扩容。
  • 并行处理多个DataFrame:针对数百个DataFrame的批量处理场景,可使用multiprocessing或concurrent.futures库实现并行运算,充分利用CPU多核资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:03:15