Pythonで最速のFFT実装は何ですか?
Numpy.fftとscipy.fftpackはどちらもFFTWではなくfftpackに基づいているようです。 fftpackはFFTWと同じくらい速いですか?マルチスレッドFFTの使用、または分散(MPI)FFTの使用はどうですか?
Cythonまたは外部ライブラリへのアクセスを可能にする他の志を同じくするツールを使用してテストしたいFFT実装を確実にラップすることができます。
FFT実装をテストする場合は、GPUベースのコードも確認することをお勧めします(適切なハードウェアにアクセスできる場合)。いくつかあります: reikna.fft 、 scikits.cuda 。
CPUベースのpython FFTWラッパー pyFFTW )もあります。
( pyFFTW もありますが、pyFFTWほど積極的に保守されておらず、Python3では動作しません。( source ))
私はこれらのいずれも経験がありません。速度が重要な場合は、特定のアプリケーションのさまざまなコードを掘り下げてベンチマークすることは、おそらくあなたの責任になります。
https://Gist.github.com/fnielsen/99b981b9da34ae3d5035 で詳細に説明されているテストの場合、データを除いて、pyfftw.interfaces.scipy_fftpack
を介したpyfftwの単純なアプリケーションと比較してscipy.fftpackが正常に機能することがわかりました。素数に対応する長さ。
Pyfftw.interfaces.scipy_fftpack.fftを初めて呼び出す場合はセットアップコストがかかるようです。 2回目はより高速です。素数の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
------------------------------------------------------------
PyFFTW3パッケージは、少なくとも実装に関しては、pyFFTWライブラリと比較して劣っています。どちらもFFTW3ライブラリをラップしているので、速度は同じであるはずです。
私が働いている場所では、特定の問題に対してFFTWをセットアップして呼び出すこのFortranライブラリをコンパイルした研究者もいます。このFortranライブラリー(いくつかのサブルーチンを持つモジュール)は、my Pythonプログラムからの入力データ(2Dリスト)を想定しています。
私がしたことは、Python Fortranライブラリをラップするための小さなC拡張機能を作成することでした。ここでは、基本的に「init」を呼び出してFFTWプランナーをセットアップし、別の関数を使用して2Dリスト(配列)、および「計算」機能。
C拡張機能の作成は小さな作業であり、その特定の作業のための優れたチュートリアルがたくさんあります。
このアプローチの良いところは、スピードが出るということです。唯一の欠点は、Pythonリストを反復処理し、すべてのPythonデータをメモリバッファーに抽出する必要があるC拡張機能にあります。
FFTW3は、うまくラップされた、利用可能な最速の実装のようです。最初の回答のPyFFTWバインディングは機能します。実行時間を比較するコードは次のとおりです: test_ffts.py
FFTWサイト は、fftpackがFFTWの約1/3の速さで実行されていることを示していますが、これは機械的に変換されたFortranからCへのステップとそれに続くCコンパイルであり、numpy/scipyが使用するかどうかわかりませんより直接的なFortranコンパイル。パフォーマンスが重要な場合は、FFTWをDLL /共有ライブラリにコンパイルしてctypesを使用してアクセスするか、カスタムC拡張機能を構築することを検討してください。