2D Convolution Runtime с использованием Python FFTW против Numpy FFT
Я играл с функциями БПФ Python, чтобы свести двумерное ядро через двумерную решетку. Неудовлетворенный быстродействием кода 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