【发布时间】:2016-02-21 05:57:38
【问题描述】:
几个月前,我发现使用 FFT 算法以最快的方式计算卷积(使用 FFTW 库更是如此)
使用下面的代码我有争议的结果。
进口
from scipy import fftpack
from numba import jit
使用 FFT 进行卷积:
def conv_fft(X, R):
n = len(X)
a = fftpack.fft(X)
b = fftpack.fft(R)
c = a * b
e = fftpack.ifft(c)
result = e[n]
return result
使用公式进行卷积:
@jit(cache=True)
def conv(X, R):
n = len(X)
result = complex_type(0)
for i in range(n+1):
result += X[n-i] * R[i]
return result
这是一个非常复杂的过程中的关键功能,只有使用一个版本或另一个版本才会出现差异。
no FFT with FFT increment
Test1 0.028761 0.034139 0.0053780
Test2 0.098565 0.103180 0.0046150
** test2 每个测试计算更多的卷积。*
测试表明使用 FFT 的代码速度较慢,我不明白为什么,因为 fftpack 显然调用了 “西方最快”的 FFTW 库...
感谢任何指导。
我的结论是 numba JIT 编译速度快得令人难以置信。
【问题讨论】: