Эти процедуры в numpy
в настоящее время, похоже, предполагают, что последнее измерение всегда будет наименьшим.Когда это действительно так, fftn
быстрее, иногда намного.
Тем не менее, я получаю гораздо меньшую разницу в производительности между этими двумя методами, чем вы (с Python 3.7.4, numpy 1.17.2).Для вашего примера, iterate_fft
занимает 46 мс, а ffn
- 50. Но если я переверну оси, до (256, 256, 32)
, я получу 55 мс и 40 мс соответственно.Если двигаться еще дальше с формой (256, 256, 2)
, я получаю 21 мс и 4 мс соответственно.
Обратите внимание, что, если производительность действительно является проблемой, доступны другие библиотеки FFT, которые работают лучше в некоторых ситуациях,Также полный пакет fftpack в scipy может иметь очень отличную производительность, чем более ограниченный код в numpy.
Обратите внимание, что ваше использование fftn
в основном делает:
x = np.random.rand(32, 256, 256)
a = np.fft.fft(x, n=256, axis=2)
a = np.fft.fft(a, n=256, axis=1)
np.testing.assert_allclose(np.fft.fftn(x, axes=(1, 2)), a)