Обычные алгоритмы БПФ намного быстрее для длины, имеющей небольшие простые множители, как объяснено здесь .
Решение состоит в том, чтобы заполнить массив нулями до следующей степени 2:
def zeropad_nextpoweroftwo(A):
return np.concatenate([A, np.zeros(int(2 ** np.ceil(np.log2(len(A))))-len(A),
dtype=A.dtype)])
Или, еще более простым / приятным решением является использование next_fast_len
и тот факт, что 2-й аргумент fftpack.fft
позволяет делать ноль-заполнение автоматически:
fftpack.fft(a, next_fast_len(len(a)))