В момента трябва да пусна FFT на сигнал от 1024 примерни точки. Досега съм внедрил свой собствен DFT алгоритъм в python, но е много бавен. Ако използвам NUMPY fftpack или дори премина към C++ и използвам FFTW, мислите ли, че би било по-добре?
Numpy fft.pack срещу FFTW срещу Внедрете DFT сами
Отговори (3)
Ако внедрявате DFFT изцяло в рамките на Python, вашият код ще работи порядък по-бавно от всеки споменат от вас пакет. Не само защото тези библиотеки са написани на езици от много по-ниско ниво, но също така (по-специално FFTW) те са написани толкова силно оптимизирани, като се възползват от местоположението на кеша, векторните единици и по същество всеки трик в книгата, че не би било изненада мен, ако работят с 10 000 пъти скоростта на наивна реализация на Python. Дори ако използвате numpy във вашата реализация, тя пак ще бледнее в сравнение.
Значи да; използвайте fftpack на numpy. Ако това не е достатъчно бързо, можете да опитате обвързванията на Python за FFTW (PyFFTW), но ускоряването от fftpack към fftw няма да е толкова драматично. Наистина се съмнявам, че има нужда да се спирам на C++ само за FFT - те са нещо като идеалния случай за свързване на Python.
Ако имате нужда от скорост, тогава искате да изберете FFTW, вижте pyfftw проект. За да използвате инструкциите на процесора SIMD
, трябва да подравните данните и няма лесен начин да го направите в numpy
. Освен това pyfftw
ви позволява да използвате истинска многопоточност, така че повярвайте ми, ще бъде много по-бързо.
В случай, че искате да се придържате към Python (обработването и поддържането на персонализирани C++ свързвания може да отнеме много време), имате алтернативата да използвате Реализация на FFT на OpenCV.
Събрах пример за играчка, сравняващ функциите dft() на OpenCV и fft2 на numpy в python (Intel(R) Core(TM) i7-3930K CPU).
samplesFreq_cv2 = [
cv2.dft(samples[iS])
for iS in xrange(nbSamples)]
samplesFreq_np = [
np.fft.fft2(samples[iS])
for iS in xrange(nbSamples)]
Резултати за последователно трансформиране на 20 000 изображения с различни разделителни способности от 20x20 до 60x60:
fft2 на Numpy: 1,709100 секунди
dft на OpenCV: 0,621239 секунди
Това вероятно не е толкова бързо, колкото свързването към специализирана C++ библиотека като fftw, но е доста нисък плод.