2

テストスクリプトを実行します。FFTW に基づく numpy.fft.fft()、anfft.fft() および FFTW に基づく pyfftw.interfaces.numpy_fft.fft() を使用します。

ここに私のテストスクリプトのソースがあります:

import numpy as np
import anfft
import pyfftw
import time

a = pyfftw.n_byte_align_empty(128, 16, 'complex128')
a[:] = np.random.randn(128) + 1j*np.random.randn(128)

time0 = time.clock()
res1 = np.fft.fft(a)
time1 = time.clock()
res2 = anfft.fft(a)
time2 = time.clock()
res3 = pyfftw.interfaces.numpy_fft.fft(a,threads=50)
time3 = time.clock()

print 'Time numpy: %s' % (time1 - time0)
print 'Time anfft: %s' % (time2 - time1)
print 'Time pyfftw: %s' % (time3 - time2)

そして、私はこれらの結果を得る:

Time numpy: 0.00154248116307
Time anfft: 0.0139805208195
Time pyfftw: 0.137729374893

anfft ライブラリは巨大なデータに対してより高速な fft を生成しますが、pyfftw はどうですか? なぜそれはとても遅いですか?

4

3 に答える 3

5

この場合、CPU コアの数よりも多くのスレッドを生成しても、パフォーマンスは向上しません。また、スレッドを切り替えるオーバーヘッドにより、プログラムが遅くなる可能性があります。50 スレッドは完全にやり過ぎです。

1 つのスレッドでベンチマークを試してください。

于 2013-09-16T02:01:50.153 に答える
4

ここでの問題は、numpy_fftインターフェースを使用する際のオーバーヘッドです。まず、 でキャッシュを有効にしてpyfftw.interfaces.cache.enable()から、 で結果をテストする必要がありますtimeit。キャッシュを使用しても、未加工のインターフェイスを使用する場合には存在しない、インターフェイスを使用する固定オーバーヘッドがあります。

私のマシンでは、長さ 128 の配列で、インターフェイスのオーバーヘッドにより、依然としてnumpy.fft. 長さが増加するにつれて、このオーバーヘッドはそれほど重要ではなくなるため、たとえば 16000 の長さの配列では、numpy_fftインターフェイスが高速になります。

インターフェイス側で速度を上げるために呼び出すことができる微調整がありますが、これらはあなたの場合に大きな違いをもたらす可能性は低いです.

すべての状況で最速の変換を取得する最善の方法は、FFTWオブジェクトを直接使用することです。これを行う最も簡単な方法は、ビルダー関数を使用することです。あなたの場合:

t = pyfftw.builders.fft(a)
timeit t()

これにより、pyfftw はnp.fft長さ 128 の配列よりも約 15 倍高速になります。

于 2014-07-09T08:00:47.597 に答える