Улучшение производительности FFT в Python - PullRequest
25 голосов
/ 16 июня 2011

Какая самая быстрая реализация FFT в Python?

Кажется, что numpy.fft и scipy.fftpack основаны на fftpack, а не на FFTW. Fftpack так же быстро, как FFTW? Как насчет использования многопоточного FFT или распределенного (MPI) FFT?

Ответы [ 6 ]

19 голосов
/ 16 июня 2011

Вы, безусловно, можете обернуть любую реализацию FFT, которую вы хотели протестировать, используя Cython или другие инструменты с аналогичным подходом, которые позволяют вам получать доступ к внешним библиотекам.

на основе графического процессора

Если выСобираясь протестировать реализации FFT, вы также можете взглянуть на коды на основе GPU (если у вас есть доступ к надлежащему оборудованию).Их несколько: reikna.fft , scikits.cuda .

на базе процессора

Есть также оболочка FFTW на базе процессора Python pyFFTW .

(также существует pyFFTW3 , но он не так активно поддерживается как pyFFTW и не работает с Python3. ( source ))

У меня нет опыта ни с одним из них.Возможно, вам придется покопаться и сравнить различные коды для вашего конкретного приложения, если скорость важна для вас.

10 голосов
/ 07 мая 2015

Для теста, детализированного в https://gist.github.com/fnielsen/99b981b9da34ae3d5035, я считаю, что scipy.fftpack работает хорошо по сравнению с моим простым применением pyfftw через pyfftw.interfaces.scipy_fftpack, за исключением данных с длиной, соответствующей простому числу.

Похоже, что при первом вызове pyfftw.interfaces.scipy_fftpack.fft возникает некоторая стоимость установки.Второй раз это быстрее.Fftpack от Numpy's и scipy с простым номером ужасно подходит для размера данных, которые я пробовал.CZT быстрее в этом случае.Несколько месяцев назад в Github Сципи была поставлена ​​проблема, см. https://github.com/scipy/scipy/issues/4288

20000 prime=False
  padded_fft : 0.003116
   numpy_fft : 0.003502
   scipy_fft : 0.001538
         czt : 0.035041
    fftw_fft : 0.004007
------------------------------------------------------------
20011 prime=True
  padded_fft : 0.001070
   numpy_fft : 1.263672
   scipy_fft : 0.875641
         czt : 0.033139
    fftw_fft : 0.009980
------------------------------------------------------------
21803 prime=True
  padded_fft : 0.001076
   numpy_fft : 1.510341
   scipy_fft : 1.043572
         czt : 0.035129
    fftw_fft : 0.011463
------------------------------------------------------------
21804 prime=False
  padded_fft : 0.001108
   numpy_fft : 0.004672
   scipy_fft : 0.001620
         czt : 0.033854
    fftw_fft : 0.005075
------------------------------------------------------------
21997 prime=True
  padded_fft : 0.000940
   numpy_fft : 1.534876
   scipy_fft : 1.058001
         czt : 0.034321
    fftw_fft : 0.012839
------------------------------------------------------------
32768 prime=False
  padded_fft : 0.001222
   numpy_fft : 0.002410
   scipy_fft : 0.000925
         czt : 0.039275
    fftw_fft : 0.005714
------------------------------------------------------------
3 голосов
/ 18 октября 2013

Пакет pyFFTW3 уступает библиотеке pyFFTW, по крайней мере, с точки зрения реализации.Так как они оба обертывают библиотеку FFTW3, я думаю, скорость должна быть одинаковой.

https://pypi.python.org/pypi/pyFFTW

2 голосов
/ 16 июня 2011

Где я работаю, некоторые исследователи скомпилировали эту библиотеку Фортрана, которая устанавливает и вызывает FFTW для конкретной проблемы.В этой библиотеке Fortran (модуль с некоторыми подпрограммами) ожидаются некоторые входные данные (2D-списки) из моей программы на Python.

Я создал небольшое C-расширение для Python, обертывающее библиотеку Fortran, где я в основном вызываю«init» для настройки планировщика FFTW, а также другая функция для подачи моих 2D-списков (массивов) и «compute».

Создание C-расширений - небольшая задача, и там много хорошегоучебники для этой конкретной задачи.

К хорошему в этом подходе является то, что мы получаем скорость ... большую скорость.Единственный недостаток в C-расширении, где мы должны перебирать список Python и извлекать все данные Python в буфер памяти.

1 голос
/ 10 декабря 2011

FFTW3, кажется, самая быстрая из доступных реализаций, которая красиво упакована. Привязки PyFFTW в первом ответе работают. Вот некоторый код, который сравнивает время выполнения: test_ffts.py

1 голос
/ 16 июня 2011

Сайт FFTW показывает, что fftpack работает примерно на 1/3 быстрее, чем FFTW, но это с механически переведенным шагом Fortran-to-C, за которым следует компиляция C, и я не знаю, является ли numpy / scipy использует более прямую компиляцию на Фортране. Если производительность критична для вас, вы можете подумать о том, чтобы скомпилировать FFTW в DLL / общую библиотеку и использовать ctypes для доступа к ней, или создать собственное расширение C.

...