¿Es MATLAB más rápido que Python?

Quiero calcular los campos magnéticos de algunos conductores utilizando la ley Biot-Savart y quiero usar una matriz de 1000x1000x1000. Antes de usar MATLAB, pero ahora quiero usar Python. ¿Python es más lento que MATLAB? ¿Cómo puedo hacer Python más rápido?

EDITAR: Tal vez la mejor manera sea calcular la gran matriz con C / C ++ y luego transferirlos a Python. Quiero visualizar entonces con VPython .

EDIT2: ¿Cuál es mejor en mi caso: C o C ++?

Puede encontrar algunos resultados útiles al final de este enlace.

http://wiki.scipy.org/PerformancePython

De la introducción,

Una comparación del tejido con NumPy, Pyrex, Psyco, Fortran (77 y 90) y C ++ para resolver la ecuación de Laplace.

También compara MATLAB y parece mostrar velocidades similares a las de Python y NumPy .

Por supuesto, esto es solo un ejemplo específico, su aplicación podría permitir un rendimiento mejor o peor. No hay daño en ejecutar la misma prueba en ambos y en comparar.

También puede comstackr NumPy con bibliotecas optimizadas como ATLAS que proporciona algunas rutinas BLAS / LAPACK . Estos deben ser de una velocidad comparable a la de MATLAB.

No estoy seguro de si las descargas de NumPy ya están integradas, pero creo que ATLAS ajustará las bibliotecas a su sistema si comstack NumPy.

http://www.scipy.org/Installing_SciPy/Windows

El enlace tiene más detalles sobre lo que se requiere en la plataforma Windows.

EDITAR:

Si desea averiguar qué rendimiento es mejor, C o C ++, podría valer la pena hacer una nueva pregunta. Aunque desde el enlace anterior C ++ tiene mejor rendimiento. Otras soluciones también están muy cerca, por ejemplo, Pyrex, Python / Fortran (usando f2py) y C ++ en línea.

El único álgebra matricial bajo C ++ que he hecho fue usar MTL e implementar un filtro de Kalman extendido. Sin embargo, creo que, en esencia, depende de las bibliotecas que esté utilizando LAPACK / BLAS y qué tan bien optimizado está.

Este enlace tiene una lista de paquetes numéricos orientados a objetos para muchos idiomas.

http://www.oonumerics.org/oon/

NumPy y MATLAB usan una implementación BLAS subyacente para operaciones de álgebra lineal estándar. Durante algún tiempo, ambos usaron ATLAS , pero en la actualidad, MATLAB aparentemente también viene con otras implementaciones como la Biblioteca del núcleo de matemáticas de Intel (MKL). Cuál es más rápido por cuánto depende del sistema y cómo se compiló la implementación de BLAS. También puede comstackr NumPy con MKL y Enthought está trabajando en el soporte de MKL para su distribución de Python (ver su hoja de ruta ). Aquí también hay una publicación de blog interesante reciente sobre esto.

Por otro lado, si necesita operaciones o estructuras de datos más especializadas, Python y MATLAB le ofrecen varias formas de optimización (como Cython , PyCUDA , …).

Edit: corrigí esta respuesta para tener en cuenta diferentes implementaciones de BLAS. Espero que ahora sea una representación justa de la situación actual.

La única prueba válida es compararlo. Realmente depende de cuál sea su plataforma y de qué tan bien la Ley de Biot-Savart se asigna a Matlab o a las operaciones integradas de NumPy / SciPy.

En cuanto a hacer que Python sea más rápido, Google está trabajando en Unladen Swallow, un comstackdor JIT para Python. Probablemente hay otros proyectos como este también.

Según su edición 2, le recomiendo encarecidamente que utilice Fortran porque puede aprovechar las subrutinas de álgebra lineal disponibles (Lapack y Blas) y es mucho más sencillo que C / C ++ para cálculos matriciales.

Si prefiere utilizar un enfoque de C / C ++, yo usaría C, porque presumiblemente necesita un rendimiento en bruto en una interfaz presumiblemente simple (los cálculos matriciales tienden a tener interfaces simples y algoritmos complejos).

Sin embargo, si decide utilizar C ++, puede usar TNT (el kit de herramientas numéricas de plantillas, la implementación de Lapack en C ++).

Buena suerte.

Si solo estás usando Python (con NumPy), puede ser más lento, dependiendo de las piezas que uses, si tienes o no instaladas las bibliotecas de álgebra lineal optimizadas y qué tan bien sabes cómo aprovechar NumPy.

Para hacerlo más rápido, hay algunas cosas que puedes hacer. Existe una herramienta llamada Cython que le permite agregar declaraciones de tipo al código de Python y traducirlo a un módulo de extensión de Python en C. La cantidad de beneficios que esto obtiene depende en parte de cuán diligente sea con sus declaraciones de tipo, si no lo hace. No agregue nada en absoluto, no verá mucho de ningún beneficio. Cython también es compatible con los tipos NumPy, aunque estos son un poco más complicados que otros tipos.

Si tiene una buena tarjeta gráfica y está dispuesto a aprender un poco sobre la computación de la GPU, PyCUDA también puede ayudar. (Si no tiene una tarjeta gráfica nvidia, oigo que hay un PyOpenCL en las obras también). No conozco el dominio de su problema, pero si puede asignarse a un problema de CUDA, entonces debería poder manejar sus elementos de 10 ^ 9 muy bien.

Y aquí hay una “comparación” actualizada entre MATLAB y NumPy / MKL basada en algunas funciones de álgebra lineal:

http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/

El producto punto no es tan lento 😉

También me gustaría señalar que Python (+ NumPy) puede interactuar fácilmente con Fortran a través del módulo F2Py, que básicamente le proporciona velocidades nativas de Fortran en las piezas de código que descarga.

No pude encontrar muchos números difíciles para responder esta misma pregunta, así que seguí adelante e hice las pruebas yo mismo. Los resultados, los scripts y los conjuntos de datos utilizados están disponibles aquí en mi publicación sobre MATLAB vs Python speed para el análisis de vibraciones .

En pocas palabras, la función FFT en MATLAB es mejor que Python, pero puedes realizar una manipulación simple para obtener resultados y velocidad comparables. También descubrí que la importación de datos era más rápida en Python en comparación con MATLAB (incluso para archivos MAT que utilizan scipy.io).