Esto puede no ser la respuesta que está buscando, pero una forma de acelerarlo considerablemente es el uso de una GPU en lugar de su CPU. Si tiene una tarjeta de gráficos decentemente poderosa, superará a su CPU en cualquier momento, incluso si su sistema está muy bien ajustado.
Para una buena integración con numpy, puede usar theano (si su tarjeta gráfica está hecha por nvidia). El cálculo en el siguiente código funciona para mí en un par de segundos (aunque tengo un muy potente tarjeta gráfica):
$ THEANO_FLAGS=device=gpu0 python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import theano
Using gpu device 0: GeForce GTX 480
>>> from theano import tensor as T
>>> import numpy
>>> x = numpy.ones((200000, 1000), dtype=numpy.float32)
>>> m = T.matrix()
>>> mTm = T.dot(m.T, m)
>>> f = theano.function([m], mTm)
>>> f(x)
array([[ 200000., 200000., 200000., ..., 200000., 200000., 200000.],
[ 200000., 200000., 200000., ..., 200000., 200000., 200000.],
[ 200000., 200000., 200000., ..., 200000., 200000., 200000.],
...,
[ 200000., 200000., 200000., ..., 200000., 200000., 200000.],
[ 200000., 200000., 200000., ..., 200000., 200000., 200000.],
[ 200000., 200000., 200000., ..., 200000., 200000., 200000.]], dtype=float32)
>>> r = f(x)
>>> r.shape
(1000, 1000)
que iba a esperar para saber cuánto tiempo >>> numpy.dot(x.T, x)
tomó a modo de comparación, pero se aburrió ...
También puede probar PyCuda o PyOpenCL (si no tiene una tarjeta gráfica nvidia), aunque no sé si su soporte numpy es tan sencillo.
Se me acaba de ocurrir que con las matrices esta gran memoria será una limitación para muchas tarjetas gráficas. Algo a tener en cuenta. –
aunque esta es de hecho una buena alternativa, ciertamente no es normal que su multiplicación de CPU tome tanto tiempo – steabert
Muchas gracias por el puntero. Esto es muy interesante y vale la pena investigarlo. – NPE