为了解一个微分方程,我需要反复进行三维函数的傅里叶变换/逆傅里叶变换。比如:
import pyfftw.interfaces.numpy_fft as fftw
for i in range(largeNumber):
fFS = fftw.rfftn(f)
# Do stuff
f = fftw.irfftn(fFS)
f的形状是高度非立方的。是否存在基于维度顺序的性能差异,例如(512、32、128)与(512、128、32)等。?你知道吗
我正在寻找任何可用的加速。我已经试过玩弄智慧了。我认为如果最大的维度最后一个(例如32、128、512),那么它可能是最快的fFS.形状=(32、128、257),但情况似乎并非如此。你知道吗
如果您真的想尽可能地压缩所有性能,可以直接使用FFTW对象(最容易通过
pyfftw.builders
访问)。通过这种方式,您可以精确地控制发生了哪些拷贝,以及是否对反向执行规范化。你知道吗使用缓存(通过调用
pyfftw.interfaces.cache.enable()
来启用)可能会使您的代码受益匪浅,因为缓存可以最大限度地减少一般情况和安全情况的设置时间,但不会消除它。你知道吗关于尺寸的最佳排列,你得吸进去看看。尝试所有不同的选项,看看什么是最快的(使用
timeit
)。确保在执行测试时,您实际使用的是按预期排列在内存中的数据,而不仅仅是查看内存中的同一个数组(没有副本的情况下,pyfftw
可以很好地处理这些数组-尽管这类事情有调整参数)。你知道吗FFTW
尝试许多不同的选项(不同的FFT表示上的不同算法)并选择最快的,因此您最终会得到一些不明显的实现,这些实现可能会因表面上非常相似的不同数据集而发生变化。你知道吗一般提示:
threads=N
)。你知道吗相关问题 更多 >
编程相关推荐