在Python中提高FFT性能

Cha*_*net 26 python numpy fft scipy fftw

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

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

Jos*_*del 20

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

基于GPU

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

基于CPU

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

(也有pyFFTW3,但它不像pyFFTW那样主动维护,并且它不适用于Python3.(源码))

我没有任何这些经验.如果速度对您很重要,那么您可能需要进行一些挖掘并为特定应用程序设置不同的代码.

  • 这个答案有点陈旧,但在Google上却很高.[我的FFTW](https://github.com/hgomersall/pyFFTW)包装器更加积极地维护,pyFFTW3和我喜欢在他们提供的内容中更加完整. (10认同)

Fin*_*sen 10

对于在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
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)