1

我一直在玩 Python 的 FFT 函数,以便在 2D 晶格上卷积 2D 内核。由于对 Numpy 代码的性能速度不满意,我尝试实现 PyFFTW3,并惊讶地发现运行时间增加了。是否有任何直接的方法可以通过 PyFFTW3 或其他包(即 Scipy.signal)进一步优化此计算?

下面比较了 Numpy 与 PyFFTW3 脚本。

import numpy as np
from math import *
import pyfftw

U = 100

### 2D kernel ###
m = np.arange(U)
i = m.reshape(U,1)
j = m.reshape(1,U)

r = np.minimum(i, U-i)**2 + np.minimum(j, U-j)**2
ker = np.exp(-(r)**2)
ker = ker/np.sum(ker)

### 2D lattice ###
lattice = np.random.randint(3, size=(U,U))

def fft_numpy():
    v1 = np.fft.fft2(ker)       
    v2 = np.fft.fft2(lattice)        
    v0 = np.fft.ifft2(v1*v2)      
    dd = np.around(np.abs(v0), decimals=3)  
    return v1, v2, dd

def fft_pyfftw():    
    v1 = pyfftw.interfaces.numpy_fft.fft2(ker)       
    v2 = pyfftw.interfaces.numpy_fft.fft2(lattice)        
    v0 = pyfftw.interfaces.numpy_fft.ifft2(v1*v2)      
    dd = np.around(np.abs(v0), decimals=3)  
    return v1, v2, dd


>> from timeit import timeit
>> timeit(fft_numpy, number=5000)
5.781297922134399
>> timeit(fft_pyfftw, number=5000)
5.930016040802002
4

0 回答 0