Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么基于FFTW的pyfftw速度较慢;s fft()?_Python_Fft - Fatal编程技术网

Python 为什么基于FFTW的pyfftw速度较慢;s fft()?

Python 为什么基于FFTW的pyfftw速度较慢;s fft()?,python,fft,Python,Fft,我运行测试SQcript。它使用numpy.fft.fft()、基于FFTW的anfft.fft()和基于FFTW的pyfftw.interfaces.numpy_fft.fft() 以下是我的测试脚本的来源: 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

我运行测试SQcript。它使用numpy.fft.fft()、基于FFTW的anfft.fft()和基于FFTW的pyfftw.interfaces.numpy_fft.fft()

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

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)
我得到了这些结果:

Time numpy: 0.00154248116307
Time anfft: 0.0139805208195
Time pyfftw: 0.137729374893

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

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


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

在这种情况下,产生的线程数超过CPU核心数不会提高性能,并且可能会由于切换线程的开销而使程序速度变慢。50个线程完全是多余的


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

可能pyFFTW实际上花费了大部分时间来规划转换。尝试在pyfftw fft调用中包含例如
planner\u efforce='FFTW\u ESTIMATE'
,看看这会如何影响性能。

可能pyfftw实际上花费了大部分时间规划转换。尝试在pyfftw fft调用中包括例如
planner\u efforce='FFTW\u ESTIMATE'
,看看这会如何影响性能。

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

在我的机器上,在128长度的数组上,接口的开销仍然比
numpy.fft
慢得多。随着长度的增加,这种开销变得不那么重要,比如说16000长度的数组,
numpy\u fft
接口速度更快

在接口端,您可以调用一些函数来加快速度,但这些函数在您的情况下不太可能产生太大的影响

在所有情况下,获得尽可能快的转换的最佳方法是直接使用,最简单的方法是使用函数。就你而言:

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

因此,我得到pyfftw比128长度数组的
np.fft
快15倍。

这里的问题是使用
numpy\u fft
接口的开销。首先,应该使用
pyfftw.interfaces.cache.enable()
启用缓存,然后使用
timeit
测试结果。即使使用缓存,使用原始接口时不存在的接口也会带来固定的开销

在我的机器上,在128长度的数组上,接口的开销仍然比
numpy.fft
慢得多。随着长度的增加,这种开销变得不那么重要,比如说16000长度的数组,
numpy\u fft
接口速度更快

在接口端,您可以调用一些函数来加快速度,但这些函数在您的情况下不太可能产生太大的影响

在所有情况下,获得尽可能快的转换的最佳方法是直接使用,最简单的方法是使用函数。就你而言:

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

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

回答得好。但实际上,OP应该尝试使用(假设是8核机器)进行基准测试,比如1、2、4、8、16、32和64个线程,看看它在达到8个线程时会变得更快,然后又开始变慢,这应该会让你的观点更加明确。此外,由于数据集如此之小,代码很可能会在线程启动和拆卸上浪费更多时间,数据分区和组合等都比实际工作中节省的要多,所以任何有用的基准测试都应该使用更多的数据。回答得好。但实际上,OP应该尝试使用(假设是8核机器)进行基准测试,比如1、2、4、8、16、32和64个线程,看看它在达到8个线程时会变得更快,然后又开始变慢,这应该会让你的观点更加明确。此外,由于数据集如此之小,代码很可能会在线程启动和拆卸上浪费更多时间,数据分区和组合等都比实际工作中节省的要多,所以任何有用的基准测试都应该使用更多的数据。您不应该以这种方式分析代码
time.clock()
通常不适合使用,你没有禁用GC,你只做了一次重复…正确的方法是使用,它会为你处理所有事情,包括你没有想到的需要处理的东西。我发现numpy.fft.fft也比matlab fft函数快。不知道为什么。你不应该这样分析代码
time.clock()
通常不适合使用,你没有禁用GC,你只做了一次重复…正确的方法是使用,它会为你处理所有事情,包括你没有想到的需要处理的东西。我发现numpy.fft.fft也比matlab fft函数快。不知道为什么。