web-dev-qa-db-ja.com

PythonでのFFTパフォーマンスの改善

Pythonで最速のFFT実装は何ですか?

Numpy.fftとscipy.fftpackはどちらもFFTWではなくfftpackに基づいているようです。 fftpackはFFTWと同じくらい速いですか?マルチスレッドFFTの使用、または分散(MPI)FFTの使用はどうですか?

26
Charles Brunet

Cythonまたは外部ライブラリへのアクセスを可能にする他の志を同じくするツールを使用してテストしたいFFT実装を確実にラップすることができます。

GPUベース

FFT実装をテストする場合は、GPUベースのコードも確認することをお勧めします(適切なハードウェアにアクセスできる場合)。いくつかあります: reikna.fftscikits.cuda

CPUベース

CPUベースのpython FFTWラッパー pyFFTW )もあります。

pyFFTW もありますが、pyFFTWほど積極的に保守されておらず、Python3では動作しません。( source ))

私はこれらのいずれも経験がありません。速度が重要な場合は、特定のアプリケーションのさまざまなコードを掘り下げてベンチマークすることは、おそらくあなたの責任になります。

19
JoshAdel

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
------------------------------------------------------------
10

PyFFTW3パッケージは、少なくとも実装に関しては、pyFFTWライブラリと比較して劣っています。どちらもFFTW3ライブラリをラップしているので、速度は同じであるはずです。

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

3
ABDreverhaven

私が働いている場所では、特定の問題に対してFFTWをセットアップして呼び出すこのFortranライブラリをコンパイルした研究者もいます。このFortranライブラリー(いくつかのサブルーチンを持つモジュール)は、my Pythonプログラムからの入力データ(2Dリスト)を想定しています。

私がしたことは、Python Fortranライブラリをラップするための小さなC拡張機能を作成することでした。ここでは、基本的に「init」を呼び出してFFTWプランナーをセットアップし、別の関数を使用して2Dリスト(配列)、および「計算」機能。

C拡張機能の作成は小さな作業であり、その特定の作業のための優れたチュートリアルがたくさんあります。

このアプローチの良いところは、スピードが出るということです。唯一の欠点は、Pythonリストを反復処理し、すべてのPythonデータをメモリバッファーに抽出する必要があるC拡張機能にあります。

FFTW3は、うまくラップされた、利用可能な最速の実装のようです。最初の回答のPyFFTWバインディングは機能します。実行時間を比較するコードは次のとおりです: test_ffts.py

1
keflavich

FFTWサイト は、fftpackがFFTWの約1/3の速さで実行されていることを示していますが、これは機械的に変換されたFortranからCへのステップとそれに続くCコンパイルであり、numpy/scipyが使用するかどうかわかりませんより直接的なFortranコンパイル。パフォーマンスが重要な場合は、FFTWをDLL /共有ライブラリにコンパイルしてctypesを使用してアクセスするか、カスタムC拡張機能を構築することを検討してください。

1