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

0 ответов

Другие вопросы по тегам