python - FFT 卷积并不比规范卷积计算快

标签 python numba

几个月前,我发现卷积是使用 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 编译速度快得令人难以置信。

最佳答案

您仅返回卷积的单个值(第 n 个值),而不是完整数组。使用 FFT,您始终计算所有值,而在您的转换函数中,您只计算您想要的值。就复杂性而言,FFT 是 O(N*log(N)),而您的 conv 实现是 O(N)。如果您要实现一个返回完整卷积的朴素转换函数,那么它将是 O(N^2)。 因此,如果您想要完整的卷积数组,最好的选择是 FFT 方法。如果您只想要第 n:th 值,那么您的方法在复杂性方面是最好的。

关于python - FFT 卷积并不比规范卷积计算快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35529317/

相关文章:

python - 在通过 pip 安装 mysql-connector 期间找不到 Protobuf 包含目录

python - 绘制直方图的最佳拟合曲线

python - 使用pytest-bdd后台设置多行

python - numba 中零维数组的签名是什么

python - @jit 减速功能

python - 数组作为numba中的函数参数

python - numba @vectorize 目标 ='parallel' TypeError

python - 创建帐户时Django字段重复键

Pythonic 方式循环对象属性并分配新属性

python - 在 Numba 中创建日期数组?