gpt4 book ai didi

python-3.x - 进行 FFT 的最快方法

转载 作者:行者123 更新时间:2023-12-05 02:23:03 25 4
gpt4 key购买 nike

我有以下使用各种接口(interface)执行 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.fft2pyfftw.interfaces.numpy_fft.fft2 需要相当长的时间,但我确定大部分时间都在计划阶段,这只会在第一次发生。在我的例子中,(每个进程)只会执行一个 FFT2 和一个 IFFT2,所以计划让我很痛苦。如果其中任何一个在不忘记智慧的情况下第二次运行,它们也会在大约 0.33 秒内运行(但在我的情况下不会发生这种情况)。

所以,问题是:1. 我在导致数据错误的 pyfftw.FFTW 中做错了什么?- 或者 -2. 如何更改pyfftw.interfaces.scipy_fftpack.fft2pyfftw.interfaces.numpy_fft.fft2的规划方案和时限?

最佳答案

修改了代码以正确使用 pyfftw.FFTW 类,使其最有效,并将执行时间减少了两倍与“构建器”类。

import time
import numpy
import pyfftw
import multiprocessing
nthread = multiprocessing.cpu_count()
a = numpy.random.rand(2364,2756).astype('complex128')
"""
Uncomment below to use 32 bit floats,
increasing the speed by a factor of 4
and remove the difference between the "builders" and "FFTW" methods
"""
#a = numpy.random.rand(2364,2756).astype('complex64')

start = time.time()
b1 = numpy.fft.fft2(a)
end1 = time.time() - start

start = time.time()
b2 = pyfftw.interfaces.scipy_fftpack.fft2(a, threads=nthread)
end2 = time.time() - start

pyfftw.forget_wisdom()
start = time.time()
b3 = pyfftw.interfaces.numpy_fft.fft2(a, threads=nthread)
end3 = time.time() - start

""" By far the most efficient method """
pyfftw.forget_wisdom()
start = time.time()
b4 = numpy.zeros_like(a)
fft = pyfftw.FFTW( a, b4, axes=(0,1), direction='FFTW_FORWARD', flags=('FFTW_MEASURE', ), threads=nthread, planning_timelimit=None )
fft()
end4 = time.time() - start

"""
For large arrays avoiding the copy is very important,
doing this I get a speedup of 2x compared to not using it
"""
pyfftw.forget_wisdom()
start = time.time()
b5 = numpy.zeros_like(a)
fft = pyfftw.builders.fft2(a, s=None, axes=(-2, -1), overwrite_input=False, planner_effort='FFTW_MEASURE', threads=nthread, auto_align_input=False, auto_contiguous=False, avoid_copy=True)
b5 = fft()
end5 = 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)
print('pyfftw.builders: %.3f secs.' % end5)

我的 4 核 i5 CPU 上的示例输出时间,使用 64 位 float :

numpy.fft.fft2:                        1.537 secs.
pyfftw.interfaces.scipy_fftpack.fft2: 0.248 secs.
pyfftw.interfaces.numpy_fft.fft2: 0.248 secs.
pyfftw.FFTW: 0.084 secs.
pyfftw.builders: 0.143 secs.

我的 4 核 i5 CPU 上的示例输出时间,使用 32 位 float :

numpy.fft.fft2:                        1.414 secs.
pyfftw.interfaces.scipy_fftpack.fft2: 0.066 secs.
pyfftw.interfaces.numpy_fft.fft2: 0.066 secs.
pyfftw.FFTW: 0.043 secs.
pyfftw.builders: 0.043 secs.

关于python-3.x - 进行 FFT 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25527291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com