2010-01-25 49 views
32

Quiero calcular los campos magnéticos de algunos conductores usando el Biot–Savart law 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?¿Es MATLAB más rápido que Python?

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

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

+4

Es difícil estimar la velocidad sin código. Si tiene algún código de Python que funcione, puede publicarlo nuevamente para obtener consejos sobre la aceleración. – extraneon

+1

Matlab es normalmente ridículamente bueno optimizando los cálculos de la matriz –

+0

@ Blue: los cálculos individuales deben ejecutarse bastante rápido. Pero no sabemos qué tan bien se asigna Biot-Savart a los cálculos de Matlab. Si no es adecuado para la vectorización, será bastante lento. –

Respuesta

26

Es posible encontrar algunos resultados útiles en la parte inferior de este enlace

http://wiki.scipy.org/PerformancePython

Desde la introducción,

Una comparación de la armadura 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 cuando se usa Python y NumPy.

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

También puede compilar NumPy con bibliotecas optimizadas como ATLAS que proporciona algunas rutinas BLAS/LAPACK. Estos deberían ser de velocidad comparable a MATLAB.

No estoy seguro de si las descargas NumPy ya están construidas en contra de ella, pero creo ATLAS bibliotecas sintonizar a su sistema si compilar NumPy,

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

El enlace tiene más detalles sobre lo es obligatorio en la plataforma de Windows.

EDIT:

Si desea averiguar qué funciona mejor, C o C++, podría valer la pena pedir una nueva pregunta. Aunque desde el enlace de arriba, C++ tiene el mejor rendimiento. Otras soluciones también son bastante cercanas, es decir, Pyrex, Python/Fortran (usando f2py) y C++ en línea.

El único álgebra matricial en C++ que he hecho alguna vez fue usar MTL e implementar un filtro de Kalman ampliado. Supongo que, en esencia, depende de las bibliotecas que está utilizando LAPACK/BLAS y qué tan bien optimizado es.

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

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

7

La única prueba válida es compararla. Realmente depende de cuál sea su plataforma y de cuán bien se relaciona la Ley Biot-Savart con las operaciones integradas de Matlab o NumPy/SciPy.

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

+0

¿Pero podría hacer una estimación aproximada? – kame

+1

No realmente. En el fondo, si todo se hace bien, ambos ejecutarán código C vectorizado. No sé qué tan bien está optimizado Matlab (sin acceso al código) o NumPy/SciPy (no lo he buscado) en términos de usar instrucciones SSE (o equivalentes). Tampoco sé cuánto más rápido Unladen Swallow hará el código Python. También existe la preferencia de Matlab de almacenar datos en precisión "doble"; no nos diga si su código Python está usando 'float' o' double' u otra cosa. En resumen, este es un caso clásico de datos insuficientes. Por lo tanto, "La única prueba válida es el combate". –

+0

Mi experiencia en esta área es de más de seis años y terminó hace siete años. En aquel entonces, utilicé bibliotecas proporcionadas por varios proveedores (Intel MKL fue una de ellas). La insistencia de Matlab en usar 'doble' en ese momento (recientemente habían comenzado a admitir 8 bits sin signo) significaba que teníamos que escribir algunos algoritmos en C o C++ para acelerarlos. Así que escribí una biblioteca como una capa sobre varias implementaciones para que nuestros desarrolladores tuvieran solo una API para tratar. Algunos algoritmos todavía eran demasiado lentos y tuvieron que ser reescritos en el ensamblaje. Dicho esto, no veo dónde mi respuesta fue engañosa. –

3

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

Para hacerlo más rápido, hay algunas cosas que puede hacer. Hay 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. ¿Cuánto le beneficia esto depende un poco de qué tan diligente es con sus declaraciones de tipo? Si no lo hace Si agrega alguno, no verá mucho beneficio. Cython también tiene soporte para 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 GPU, PyCUDA también puede ayudar. (Si no tiene una tarjeta gráfica nvidia, también escucho que hay un PyOpenCL en proceso). No conozco el dominio de su problema, pero si se lo puede ubicar en un problema CUDA, debería poder manejar bien sus elementos 10^9.

17

NumPy y MATLAB tanto el uso de un BLAS implementación subyacente para las operaciones de álgebra lineal estándar. Durante algún tiempo ambos usaron ATLAS, pero hoy en día MATLAB aparentemente también viene con otras implementaciones como Intel Math Kernel Library (MKL). Cuál es más rápido según cuánto dependa del sistema y cómo se compiló la implementación de BLAS. También puede compilar NumPy con MKL y Enthought está trabajando en el soporte de MKL para su distribución de Python (vea sus roadmap). Aquí también hay un reciente interesting blog post sobre esto. Por otra parte, si necesita operaciones más especializadas o estructuras de datos, Python y MATLAB le ofrecen varias formas de optimización (como Cython, PyCUDA, ...).

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

+0

Debe elaborar lo que quiere decir con "las mismas bibliotecas numéricas subyacentes". Matlab es una fuente cerrada y ha existido por más tiempo que Python, y mucho menos NumPy, así que estoy teniendo dificultades para pensar lo que podría ser un terreno común más allá, por ejemplo, del conjunto de instrucciones SSE. –

+2

Votación máxima. Nadie (exagero) escribe rutinas de manipulación de matrices, todo el mundo las llama. Por supuesto, alguien tiene que escribirlos en primer lugar, pero si estuvieras escribiendo Matlab o SciPy encontrarías una implementación increíblemente rápida de BLAS para tu (s) plataforma (s) de destino y la llamarías así. Me sorprenderá mucho saber que uno es significativamente más rápido que el otro. –

+0

@Mike: este es un conocimiento bastante común, pero para las personas sin experiencia en informática científica agregué más información en mi respuesta. – nikow

4

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

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

Si, sin embargo, decide ir con C++, puede usar TNT (el kit de herramientas numéricas de plantillas, la implementación C++ de Lapack).

Buena suerte.

+0

¡Gracias por la buena respuesta! – kame

0

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 te transfiere las velocidades nativas de Fortran en los trozos de código que descargas en él.

0

no pude No encuentro muchos números difíciles para responder esta misma pregunta, así que seguí adelante y realicé las pruebas yo mismo. Los resultados, scripts y conjuntos de datos utilizados están disponibles aquí en mi publicación en MATLAB vs Python speed for vibration analysis.

Para abreviar, la función FFT en MATLAB es mejor que la de Python, pero puede realizar algunas manipulaciones simples para obtener resultados y velocidades comparables. También encontré que la importación de datos fue más rápida en Python en comparación con MATLAB (incluso para archivos MAT que usan scipy.io).

Cuestiones relacionadas