如何优化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
相关产品推荐
相关产品推荐

