さまざまなインターフェイスを使用して 2D FFT を実行する次の非常に基本的な例があります。
import time
import numpy
import pyfftw
import multiprocessing
a = numpy.random.rand(2364,2756).astype('complex128')
start = time.time()
b1 = numpy.fft.fft2(a)
end1 = time.time() - start
start = time.time()
b2 = pyfftw.interfaces.scipy_fftpack.fft2(a, threads=multiprocessing.cpu_count())
end2 = time.time() - start
pyfftw.forget_wisdom()
start = time.time()
b3 = pyfftw.interfaces.numpy_fft.fft2(a, threads=multiprocessing.cpu_count())
end3 = time.time() - start
pyfftw.forget_wisdom()
start = time.time()
b4 = numpy.zeros_like(a)
fft = pyfftw.FFTW(a, b4, axes=(0,1), flags=('FFTW_ESTIMATE',),planning_timelimit=1.0)
fft()
end4 = time.time() - start
print('numpy.fft.fft2: %.3f secs.' % end1)
print('pyfftw.interfaces.scipy_fftpack.fft2: %.3f secs.' % end2)
print('pyfftw.interfaces.numpy_fft.fft2: %.3f secs.' % end3)
print('pyfftw.FFTW: %.3f secs.' % end4)
これにより、次の結果が生成されます。
numpy.fft.fft2: 1.878 secs.
pyfftw.interfaces.scipy_fftpack.fft2: 50.133 secs.
pyfftw.interfaces.numpy_fft.fft2: 52.136 secs.
pyfftw.FFTW: 0.331 secs.
明らかに、pyfftw.FFTW
インターフェイスは最速ですが、機能しません (何が間違っているのかわかりません)。
これpyfftw.interfaces.scipy_fftpack.fft2
にpyfftw.interfaces.numpy_fft.fft2
はかなりの時間がかかりますが、その時間は主に計画フェーズにあると判断しました。これは最初の 1 回だけです。私の場合、(プロセスごとに) 1 つの FFT2 と 1 つの IFFT2 だけが実行されるので、計画が私を殺しています。知恵を忘れずにどちらかをもう一度実行すると、約0.33秒で実行されます(ただし、これは私の場合は起こりません)。
したがって、問題は次のとおりです。1.pyfftw.FFTW
データが間違っている原因は何ですか? - または - 2. または の計画スキームと期限を変更するにはどうすればよいですpyfftw.interfaces.scipy_fftpack.fft2
かpyfftw.interfaces.numpy_fft.fft2
?