题 在Python中提高FFT性能


Python中最快的FFT实现是什么?

似乎numpy.fft和scipy.fftpack都基于fftpack,而不是FFTW。 fftpack和FFTW一样快吗?如何使用多线程FFT或使用分布式(MPI)FFT?


22
2018-06-15 23:28


起源




答案:


您当然可以使用Cython或其他允许您访问外部库的类似工具来包装您想要测试的任何FFT实现。

基于GPU

如果您要测试FFT实现,您还可以查看基于GPU的代码(如果您可以访问适当的硬件)。有几个: reikna.fftscikits.cuda

基于CPU

还有一个基于CPU的python FFTW包装器 pyFFTW

(有 pyFFTW3 同样,但它不像pyFFTW那样积极维护,并且它不适用于Python3。 (资源))

我没有任何经验。如果速度对您很重要,那么您可能需要进行一些挖掘并针对您的特定应用程序对不同的代码进行基准测试。


16
2018-06-16 00:53



这个答案有点陈旧,但在Google上却很高。 我的FFTW 更积极地维护包装,pyFFTW3和我喜欢认为它们提供的内容更加完整。 - Henry Gomersall


对于详细的测试 https://gist.github.com/fnielsen/99b981b9da34ae3d5035 我发现scipy.fftpack与我的pyfftw via的简单应用相比表现不错 pyfftw.interfaces.scipy_fftpack,除了长度对应于素数的数据。

第一次唤起pyfftw.interfaces.scipy_fftpack.fft似乎有一些设置成本。第二次它更快。 Numpy和scipy的带有素数的fftpack对我尝试过的数据大小表现得非常糟糕。在这种情况下,CZT更快。几个月前,Scipy的Github提出了一个关于这个问题的问题 https://github.com/scipy/scipy/issues/4288

20000 prime=False
  padded_fft : 0.003116
   numpy_fft : 0.003502
   scipy_fft : 0.001538
         czt : 0.035041
    fftw_fft : 0.004007
------------------------------------------------------------
20011 prime=True
  padded_fft : 0.001070
   numpy_fft : 1.263672
   scipy_fft : 0.875641
         czt : 0.033139
    fftw_fft : 0.009980
------------------------------------------------------------
21803 prime=True
  padded_fft : 0.001076
   numpy_fft : 1.510341
   scipy_fft : 1.043572
         czt : 0.035129
    fftw_fft : 0.011463
------------------------------------------------------------
21804 prime=False
  padded_fft : 0.001108
   numpy_fft : 0.004672
   scipy_fft : 0.001620
         czt : 0.033854
    fftw_fft : 0.005075
------------------------------------------------------------
21997 prime=True
  padded_fft : 0.000940
   numpy_fft : 1.534876
   scipy_fft : 1.058001
         czt : 0.034321
    fftw_fft : 0.012839
------------------------------------------------------------
32768 prime=False
  padded_fft : 0.001222
   numpy_fft : 0.002410
   scipy_fft : 0.000925
         czt : 0.039275
    fftw_fft : 0.005714
------------------------------------------------------------

8
2018-05-07 19:03





pyFFTW3包与pyFFTW库相比较差,至少是实现方式。由于它们都包装了FFTW3库,我猜速度应该是相同的。

https://pypi.python.org/pypi/pyFFTW


3
2017-10-18 12:14





在我工作的地方,一些研究人员编译了这个Fortran库,它为特定问题设置和调用FFTW。这个Fortran库(带有一些子程序的模块)期望从我的Python程序中获得一些输入数据(2D列表)。

我所做的是为Python包装Fortran库创建一个小C扩展,我基本上调用“init”来设置FFTW规划器,另一个函数来提供我的2D列表(数组)和“计算”功能。

创建C扩展是一项小任务,并且有很多很好的教程可以用于该特定任务。

关于这种方法的好处是我们获得了速度......很快的速度。唯一的缺点是在C扩展中我们必须迭代Python列表,并将所有Python数据提取到内存缓冲区中。


1
2018-06-16 07:15



使用Cython,您可以直接访问内存中的数据,而无需复制它。 - Charles Brunet


FFTW网站 显示fftpack运行速度大约是FFTW的1/3,但这是机械翻译的Fortran-to-C步骤,然后是C编译,我不知道numpy / scipy是否使用更直接的Fortran编译。如果性能对您至关重要,您可以考虑将FFTW编译到DLL /共享库中,并使用ctypes访问它,或者构建自定义C扩展。


1
2018-06-15 23:41





FFTW3似乎是最快的实现,包装得很好。第一个答案中的PyFFTW绑定工作。这是一些比较执行时间的代码: test_ffts.py 


1
2017-12-10 18:34