首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么基于FFTW的pyfftw比numpy的fft()慢?

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

Stack Overflow用户
提问于 2013-09-16 09:57:24
回答 3查看 4.3K关注 0票数 1

我运行test sqript。它使用了基于FFTW的numpy.fft.fft()、anfft.fft()和基于FFTW的pyfftw.interfaces.numpy_fft.fft()。

以下是我的测试脚本的源代码:

代码语言:javascript
复制
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)

我得到的结果是:

代码语言:javascript
复制
Time numpy: 0.00154248116307
Time anfft: 0.0139805208195
Time pyfftw: 0.137729374893

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

EN

回答 3

Stack Overflow用户

发布于 2013-09-16 10:01:50

在这种情况下,产生比CPU核心更多的线程不会提高性能,而且可能会由于切换线程的开销而使程序变慢。50个线程完全是大材小用。

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

票数 5
EN

Stack Overflow用户

发布于 2014-07-09 16:00:48

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

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

您可以调用一些tweaks来加快接口端的速度,但这些不太可能对您的情况有太大影响。

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

代码语言:javascript
复制
t = pyfftw.builders.fft(a)
timeit t()

这样,我得到的pyfftw比长度为128的数组的np.fft快15倍。

票数 4
EN

Stack Overflow用户

发布于 2014-02-11 00:28:49

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18819431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档