为什么基于FFTW的pyfftw比numpy的fft()慢?

2024-10-01 09:38:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我运行测试脚本。它使用numpy.fft.fft(), 快速傅立叶变换()基于FFTW和pyfftw.interfaces.numpy_fft.fft()基于FFTW。在

以下是我的测试脚本的来源:

import numpy as np
import anfft
import pyfftw
import time

a = pyfftw.n_byte_align_empty(128, 16, 'complex128')
a[:] = np.random.randn(128) + 1j*np.random.randn(128)

time0 = time.clock()
res1 = np.fft.fft(a)
time1 = time.clock()
res2 = anfft.fft(a)
time2 = time.clock()
res3 = pyfftw.interfaces.numpy_fft.fft(a,threads=50)
time3 = time.clock()

print 'Time numpy: %s' % (time1 - time0)
print 'Time anfft: %s' % (time2 - time1)
print 'Time pyfftw: %s' % (time3 - time2)

我得到的结果是:

^{pr2}$

anfft库在海量数据上产生更快的fft,但是pyfftw呢?为什么这么慢?在


Tags: importfftnumpy脚本timenpinterfacesprint
3条回答

在这种情况下,生成的线程多于CPU内核不会提高性能,并且可能会由于交换线程的开销而使程序变慢。50个线程是完全超量的。在

尝试用一个线程进行基准测试。在

这里的问题是使用numpy_fft接口的开销。首先,应该使用pyfftw.interfaces.cache.enable()启用缓存,然后用timeit测试结果。即使使用缓存,如果使用原始接口,使用接口的开销也是固定的。在

在我的机器上,在128长度的数组上,接口的开销仍然比numpy.fft慢。随着长度的增加,这个开销就变得不那么重要了,比如说一个16000长度的数组,numpy_fft接口会更快。在

您可以调用tweaks来加快接口端的速度,但在您的情况下,这些不太可能有多大区别。在

在所有情况下,获得尽可能快的转换的最佳方法是直接使用^{} object,而最简单的方法是使用builders函数。在您的情况下:

t = pyfftw.builders.fft(a)
timeit t()

这样一来,pyfftw比128长度数组的np.fft快15倍。在

可能是pyFFTW实际上花费了大部分时间来计划转型。例如,尝试在pyfftw fft调用中包含planner_effort='FFTW_ESTIMATE',看看这对性能有何影响。在

相关问题 更多 >