ここでユーザーが Stackoverflow で提示したソリューションを試してみました: henry-gomersall を使用して FFT ベースの畳み込みの高速化を繰り返しましたが、異なる結果が得られました。
import numpy as np
import pyfftw
import scipy.signal
import timeit
class CustomFFTConvolution(object):
def __init__(self, A, B, threads=1):
shape = (np.array(A.shape) + np.array(B.shape))-1
if np.iscomplexobj(A) and np.iscomplexobj(B):
self.fft_A_obj = pyfftw.builders.fftn(
A, s=shape, threads=threads)
self.fft_B_obj = pyfftw.builders.fftn(
B, s=shape, threads=threads)
self.ifft_obj = pyfftw.builders.ifftn(
self.fft_A_obj.get_output_array(), s=shape,
threads=threads)
else:
self.fft_A_obj = pyfftw.builders.rfftn(
A, s=shape, threads=threads)
self.fft_B_obj = pyfftw.builders.rfftn(
B, s=shape, threads=threads)
self.ifft_obj = pyfftw.builders.irfftn(
self.fft_A_obj.get_output_array(), s=shape,
threads=threads)
def __call__(self, A, B):
fft_padded_A = self.fft_A_obj(A)
fft_padded_B = self.fft_B_obj(B)
return self.ifft_obj(fft_padded_A * fft_padded_B)
N = 200
A = np.random.rand(N, N, N)
B = np.random.rand(N, N, N)
start_time = timeit.default_timer()
C = scipy.signal.fftconvolve(A,B,"same")
print timeit.default_timer() - start_time
custom_fft_conv_nthreads = CustomFFTConvolution(A, B, threads=1)
C = custom_fft_conv_nthreads(A, B)
print timeit.default_timer() - start_time
PyFFTW は約です。他のユーザーの経験とは異なり、SciPy FFT よりも 7 倍遅くなります。このコードのどこが間違っていますか? Python 2.7.9、PyFFTW 0.9.2。