2011-05-18 15 views
12

Me gustaría calcular los valores propios de las matrices de gran tamaño (aproximadamente 1000x1000) usando Python 2.6.5. No he podido hacerlo tan rápido. No he encontrado otros hilos que aborden esta pregunta.Los cálculos de autovalores de Python son mucho más lentos que los de MATLAB en mi computadora. ¿Por qué?

Cuando corro

a = rand(1000,1000); 
tic; 
for i =1:10 
    eig(a); 
end 
toc; 

en MATLAB se tarda unos 30 segundos. Una prueba similar en Python requiere 216 segundos. Ejecutarlo a través de R usando RPy no aceleró el cálculo de manera apreciable. Una prueba en Octave tomó 93 segundos. Estoy un poco desconcertado por la diferencia de velocidad.

La única instancia de una pregunta como esta que puedo encontrar en línea es this, que tiene varios años. El póster en esa pregunta tiene una estructura de directorio de Python diferente (que atribuyo a la antigüedad de la publicación, aunque podría estar equivocado), así que no he tenido la suficiente confianza para intentar seguir las instrucciones publicadas por el corresponsal.

Mi gestor de paquetes dice que he instalado LAPACK, y estoy usando NumPy y SciPy para los cálculos de Python:

from numpy import * 
from scipy import * 
from numpy.linalg import * 
import time 

a = randn(1000,1000) 
tic = time.clock() 
for i in range(0,10): 
    eig(a) 
toc = time.clock() 
print "Elapsed time is ", toc-tic 

soy bastante nuevo en Python, por lo que puede haber hecho algo tonto. Por favor, avíseme si necesito proporcionar más información.

+1

¿Utiliza la misma precisión en Python y Matlab? –

+2

Necesita asegurarse de que su sangría en su código de Python sea exactamente correcta. Tu ejemplo no puede ejecutarse como está escrito. –

+0

Solo para hacerle saber que debe usar 'rand' para ambos (distribución uniforme) o' randn' (distribución normal) pero no para mezclarlos. Esto no explica la diferencia sin embargo. – Wok

Respuesta

3

Tengo una diferencia en los tiempos, pero no tan drástica como la tuya. Mi tiempo de MATLAB (R2010b) fue ~ 25 segundos y el tiempo de python (2.7) fue ~ 60 segundos.

No estoy muy sorprendido por estos números como MATLAB es únicamente un lenguaje numérico y la matriz de la manipulación, y tiene la ventaja de su acelerador JIT sobre python, que es un lenguaje de propósito general. En general, las diferencias entre MATLAB y python+numpy son bastante pequeñas, pero se hacen aparentes cuando el tamaño de la matriz es grande, como en su caso.

Eso no significa que no haya formas de mejorar el rendimiento de Python. El artículo PerformancePython en el sitio web de scipy brinda una buena introducción a las diferentes formas en que puede mejorar el rendimiento de python.

+2

Algo malo con ese enlace. Me parece inalcanzable. – Tshepang

14

Creo que lo que está viendo es la diferencia entre la biblioteca Intel Math Kernel (MKL) que está utilizando Matlab y la implementación de LAPACK que tenga en su sistema (ATLAS, ¿no?) Contra la que scipy está vinculado. Puede ver cuánto más rápido está el MKL en these benchmarks.

Imagino que obtendrías un rendimiento mucho mejor si pudieras reconstruir Scipy contra las bibliotecas Intel MKL. Si está usando Windows, las copias preconstruidas pueden descargarse desde here, o puede considerar usar algo como Enthought Python Distribution.

+3

Eso es ciertamente una gran parte de eso. Comparando 'np.linalg.eig' en una versión de numpy usando ATLAS vs uno enlazado contra el MKL resulta en una diferencia de aproximadamente 3 veces en mi máquina para una variedad del tamaño del OP. (10.1 segundos vs 3.2 segundos) –

Cuestiones relacionadas