numpy.fft和scipy.fftpack有什么区别?

后者只是前者的同义词,还是两种不同的FFT实现? 哪一个更好?

SciPy做的更多:

另外,SciPy通过自己的接口导出一些NumPy特性,例如,如果你执行scipy.fftpack.helper.fftfreqnumpy.fft.helper.fftfreq,你实际上运行的是相同的代码。

但是,SciPy有自己的很多function的实现。 源代码具有比较原始的NumPy和新的SciPy版本的性能基准。 我古老的笔记本电脑显示了这样的东西:

Fast Fourier Transform ================================================= | real input | complex input ------------------------------------------------- size | scipy | numpy | scipy | numpy ------------------------------------------------- 100 | 0.07 | 0.06 | 0.06 | 0.07 (secs for 7000 calls) 1000 | 0.06 | 0.09 | 0.09 | 0.09 (secs for 2000 calls) 256 | 0.11 | 0.11 | 0.12 | 0.11 (secs for 10000 calls) 512 | 0.16 | 0.21 | 0.20 | 0.21 (secs for 10000 calls) 1024 | 0.03 | 0.04 | 0.04 | 0.04 (secs for 1000 calls) 2048 | 0.05 | 0.09 | 0.08 | 0.08 (secs for 1000 calls) 4096 | 0.05 | 0.08 | 0.07 | 0.09 (secs for 500 calls) 8192 | 0.10 | 0.20 | 0.19 | 0.21 (secs for 500 calls) 

看起来,SciPy的运行速度明显快于arrays规模的增长,尽pipe这些只是人为的例子,值得对两个项目进行实验。

这是值得检查的源代码http://www.scipy.org/Download#head-312ad78cdf85a9ca6fa17a266752069d23f785d1 。 是的,那些.f文件真的是Fortran! 😀

我发现numpy的2D fft明显比scipy快,但是FFTW比两者都快(使用PyFFTW绑定)。 性能testing在这里:code.google.com/p/agpy/source/browse/trunk/tests/test_ffts.py

结果(对于n × n数组):

  n sp np fftw 8: 0.010189 0.005077 0.028378 16: 0.010795 0.008069 0.028716 32: 0.014351 0.008566 0.031076 64: 0.028796 0.019308 0.036931 128: 0.093085 0.074986 0.088365 256: 0.459137 0.317680 0.170934 512: 2.652487 1.811646 0.571402 1024: 10.722885 7.796856 3.509452 

看看每个github respositories,scipy不只是导入numpy的版本并重命名它(虽然它借用了一些function)。 如果你想辨别实现的差异,你将不得不深入到代码中,因为文档没有直接比较。

https://github.com/numpy/numpy/tree/master/numpy/fft

https://github.com/scipy/scipy/tree/master/scipy/fftpack