python - example - from scipy fftpack import fft fftfreq
¿Cuál es la diferencia entre numpy.fft y scipy.fftpack? (3)
¿Lo último es solo un sinónimo de lo primero, o son dos implementaciones diferentes de FFT? ¿Cuál es mejor?
Descubrí que el fft 2D de numpy era significativamente más rápido que el de scipy, pero FFTW era más rápido que los dos (usando los enlaces de PyFFTW). Las pruebas de rendimiento están aquí: code.google.com/p/agpy/source/browse/trunk/tests/test_ffts.py
Y los resultados (para n
x n
arrays):
n sp np fftw
8: 0.010189 0.005077 0.028378
16: 0.010795 0.008069 0.028716
32: 0.014351 0.008566 0.031076
64: 0.028796 0.019308 0.036931
128: 0.093085 0.074986 0.088365
256: 0.459137 0.317680 0.170934
512: 2.652487 1.811646 0.571402
1024: 10.722885 7.796856 3.509452
Mirando los repositorios de github para cada uno, scipy no solo está importando la versión de numpy y renombrándola (aunque toma prestadas algunas funcionalidades). Tendrá que profundizar en el código si desea discernir la diferencia en las implementaciones ya que la documentación no hace una comparación directa.
SciPy hace más:
- http://docs.scipy.org/doc/numpy/reference/routines.fft.html
- http://docs.scipy.org/doc/scipy/reference/fftpack.html#
Además, SciPy exporta algunas de las funciones de NumPy a través de su propia interfaz, por ejemplo, si ejecuta scipy.fftpack.helper.fftfreq y numpy.fft.helper.fftfreq , en realidad está ejecutando el mismo código.
Sin embargo, SciPy tiene sus propias implementaciones de mucha funcionalidad. La fuente tiene puntos de referencia de rendimiento que comparan el NumPy original y las nuevas versiones de SciPy. Mi computadora portátil arcaica muestra algo como esto:
Fast Fourier Transform
=================================================
| real input | complex input
-------------------------------------------------
size | scipy | numpy | scipy | numpy
-------------------------------------------------
100 | 0.07 | 0.06 | 0.06 | 0.07 (secs for 7000 calls)
1000 | 0.06 | 0.09 | 0.09 | 0.09 (secs for 2000 calls)
256 | 0.11 | 0.11 | 0.12 | 0.11 (secs for 10000 calls)
512 | 0.16 | 0.21 | 0.20 | 0.21 (secs for 10000 calls)
1024 | 0.03 | 0.04 | 0.04 | 0.04 (secs for 1000 calls)
2048 | 0.05 | 0.09 | 0.08 | 0.08 (secs for 1000 calls)
4096 | 0.05 | 0.08 | 0.07 | 0.09 (secs for 500 calls)
8192 | 0.10 | 0.20 | 0.19 | 0.21 (secs for 500 calls)
Parece que SciPy corre mucho más rápido a medida que aumenta el tamaño de la matriz, aunque estos son solo ejemplos artificiales y valdría la pena experimentar con ambos para su proyecto en particular.
Vale la pena consultar el código fuente http://www.scipy.org/Download#head-312ad78cdf85a9ca6fa17a266752069d23f785d1 . ¡Sí, esos archivos .f realmente son Fortran! :-RE