我有以下使用各种接口进行 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
但我已确定该时间主要处于规划阶段,这只是第一次发生。在我的情况下,只有一个 FFT2 和一个 IFFT2 将被执行(每个进程),所以计划让我很生气。如果其中任何一个在不忘记智慧的情况下再次运行,它们也会在大约 0.33 秒内运行(但在我的情况下不会发生)。
所以,问题是:1.我做错了什么pyfftw.FFTW
导致数据错误?- 或 - 2. 如何更改或的计划方案和pyfftw.interfaces.scipy_fftpack.fft2
时限pyfftw.interfaces.numpy_fft.fft2
?