我有以下使用各種接口進行二維FFT的基本示例。最快的方法來做一個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
需要相當長的時間,但我已經確定時間很大程度上處於計劃階段,這隻發生在第一次。在我的情況下,只有一個FFT2和一個IFFT2將被執行(每個進程),所以計劃正在讓我失望。如果兩者中的任何一個都不會忘記智慧,他們也會在大約0.33秒內運行(但這不會發生在我的情況中)。
所以,問題是: 1.我在做什麼錯在pyfftw.FFTW
導致數據錯誤? - 或 - 2.如何更改pyfftw.interfaces.scipy_fftpack.fft2
或pyfftw.interfaces.numpy_fft.fft2
的計劃方案和時間限制?
來自http://hgomersall.github.io/pyFFTW/pyfftw/pyfftw.html:「這些數組的內容將在計劃過程中被銷燬初始化「。 – SleuthEye 2014-08-27 14:28:43