python performance matlab numpy intel-mkl

python - MATLAB dos veces más rápido que Numpy



performance intel-mkl (2)

Soy un estudiante graduado de ingeniería que actualmente realiza la transición de MATLAB a Python para los propósitos de simulación numérica. Tenía la impresión de que para la manipulación básica de matrices, Numpy sería tan rápido como MATLAB. Sin embargo, parece que para dos programas diferentes escribo que MATLAB es un poco menos del doble de rápido que Numpy. El código de prueba que estoy usando para Numpy (Python 3.3) es:

import numpy as np import time a = np.random.rand(5000,5000,3) tic = time.time() a[:,:,0] = a[:,:,1] a[:,:,2] = a[:,:,0] a[:,:,1] = a[:,:,2] toc = time.time() - tic print(toc)

Mientras que para MATLAB 2012a estoy usando:

a = rand(5000,5000,3); tic; a(:,:,1) = a(:,:,2); a(:,:,3) = a(:,:,1); a(:,:,2) = a(:,:,3); toc

El algoritmo que estoy usando es el que se usa en un website NASA que compara a Numpy y MATLAB. El sitio web muestra que Numpy supera a MATLAB en términos de velocidad para este algoritmo. Sin embargo, mis resultados muestran un tiempo de simulación de 0.49 s para Numpy y un tiempo de simulación de 0.29 s para MATLAB. También he ejecutado un solucionador de Gauss-Seidel tanto en Numpy como en Matlab y obtengo resultados similares (16.5 s vs. 9.5 s)

Soy nuevo en Python y no soy muy culto en términos de programación. Estoy utilizando la distribución de Python de 64 bits de WinPython, pero también he probado Pythonxy sin éxito.

Una cosa que he leído que debería mejorar el rendimiento es construir Numpy usando MKL. Lamentablemente no tengo idea de cómo hacer esto en Windows. ¿Incluso necesito hacer esto?

¿Alguna sugerencia?


Esa comparación termina siendo manzanas con naranjas debido al almacenamiento en caché, porque es más eficiente transferir o realizar algún trabajo en trozos contiguos de memoria. Este punto de referencia en particular está vinculado a la memoria, ya que en realidad no se realiza ningún cálculo y, por lo tanto, el porcentaje de aciertos de caché es clave para lograr un buen rendimiento.

Matlab coloca los datos en orden de columna principal (orden de Fortran), por lo que a(:,:,k) es una parte contigua de la memoria, que es rápida de copiar.

Numpy se establece por defecto en orden de fila mayor (orden C), por lo que en a[:,:,k] hay grandes saltos entre los elementos y eso ralentiza la transferencia de memoria. En realidad, el diseño de los datos puede ser elegido. En mi computadora portátil, crear la matriz con a = np.asfortranarray(np.random.rand(5000,5000,3)) a una velocidad de 5x (1 s frente a 0,19 s).

Este resultado debería ser muy similar tanto para numpy-MKL como para plain numpy porque MKL es una implementación rápida de LAPACK y aquí no está llamando a ninguna función que la use (MKL definitivamente ayuda a la hora de resolver sistemas lineales, computar productos de puntos ...).

Realmente no sé qué está pasando con el solucionador de Gauss Seidel, pero hace un tiempo escribí una respuesta a una pregunta titulada Numpy corriendo a la mitad de la velocidad de MATLAB que habla un poco sobre MKL, FFT y el JIT de Matlab.


Está intentando recrear el experimento de la NASA, sin embargo, ha cambiado muchas de las variables. Por ejemplo:

  • Su hardware y sistema operativo son diferentes (www.nccs.nasa.gov/dali_front.html)
  • Tu versión de Python es diferente (2.5.3 vs 3.3)
  • Su versión de MATLAB es diferente (2008 vs 2012)

Suponiendo que los resultados de la NASA sean correctos, la diferencia en los resultados se debe a una o más de estas variables modificadas. Te recomiendo:

  • Repita la prueba con los binaries SciPy.
  • Investigue si se hicieron mejoras a MATLAB relación con este tipo de cálculo.

Además, puede encontrar este enlace útil.