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もあります。
( pyFFTW3もありますが、 pyFFTWほど整備が進んでおらず、Python3では動きません。( source ))
私はこれらの経験がありません。速度が重要な場合、特定のアプリケーションのさまざまなコードを掘り下げてベンチマークするのは、おそらくあなたの責任になるでしょう。
pyFFTW3 パッケージは、pyFFTW ライブラリと比較して、少なくとも実装面では劣っています。どちらもFFTW3ライブラリをラップしているので、速度は同じはずです。
私が働いている場所では、特定の問題に対してFFTWをセットアップして呼び出すこのFortranライブラリをコンパイルした研究者がいます。この Fortran ライブラリ (いくつかのサブルーチンを含むモジュール) は、Python プログラムからの入力データ (2D リスト) を想定しています。
私がしたことは、Fortran ライブラリをラップする Python 用の小さな C 拡張を作成することでした。そこでは、基本的に "init" を呼び出して FFTW プランナーをセットアップし、別の関数を呼び出して 2D リスト (配列) と "compute" 関数をフィードします。
C 拡張機能を作成するのは簡単な作業であり、その特定の作業に関する優れたチュートリアルがたくさんあります。
このアプローチの良いところは、速度が速いことです.. かなりの速度です。唯一の欠点は、Python リストを反復処理し、すべての Python データをメモリ バッファーに抽出する必要がある C 拡張にあります。
FFTW3 は、適切にラップされた最速の実装のようです。最初の回答の PyFFTW バインディングが機能します。実行時間を比較するコードは次のとおりです: test_ffts.py
FFTW サイトでは、fftpack が FFTWの約 1/3 の速さで実行されていることが示されていますが、これは機械的に Fortran から C に変換された後、C コンパイルが行われるため、numpy/scipy がより直接的な Fortran コンパイルを使用するかどうかはわかりません。パフォーマンスが重要な場合は、FFTW を DLL/共有ライブラリにコンパイルし、ctypes を使用してアクセスするか、カスタム C 拡張機能を構築することを検討してください。