¿Por qué los arreglos NumPy son tan rápidos?

Acabo de cambiar un progtwig que estoy escribiendo para mantener mis datos como matrices numpy ya que estaba teniendo problemas de rendimiento, y la diferencia fue increíble. ¡Originalmente tomó 30 minutos para correr y ahora toma 2.5 segundos!

Me preguntaba cómo lo hace. Supongo que es así porque elimina la necesidad for bucles, pero más allá de eso estoy perplejo.

Las matrices numpy son matrices densamente empaquetadas de tipo homogéneo. Las listas de Python, por el contrario, son matrices de punteros a objetos, incluso cuando todos ellos son del mismo tipo. Así, obtienes los beneficios de la localidad de referencia .

Además, muchas operaciones de Numpy se implementan en C, evitando el costo general de los bucles en Python, la indirección del puntero y la comprobación dinámica de tipos por elemento. El aumento de velocidad depende de las operaciones que esté realizando, pero unos pocos órdenes de magnitud no son infrecuentes en los progtwigs de procesamiento de números.

Las matrices numpy son estructuras de datos especializadas. Esto significa que no solo obtiene los beneficios de una representación en memoria eficiente, sino también implementaciones especializadas eficientes.

Por ejemplo, si está sumndo dos matrices, la adición se realizará con las operaciones especializadas de vectores de la CPU , en lugar de llamar la implementación de python de la adición int en un bucle.

Todavía tienes para bucles, pero se hacen en c. Numpy se basa en Atlas, que es una biblioteca para operaciones de álgebra lineal.

http://math-atlas.sourceforge.net/

Cuando se enfrente a un gran cálculo, ejecutará pruebas utilizando varias implementaciones para averiguar cuál es la más rápida en nuestro equipo en este momento. Con algunas comstackciones numpy, las comutaciones pueden ser paralelizadas en múltiples CPUs. Por lo tanto, tendrá una ejecución altamente optimizada de c en bloques de memoria continua.

Las matrices numpy son extremadamente similares a las matrices “normales”, como las de c. Tenga en cuenta que cada elemento tiene que ser del mismo tipo. La aceleración es excelente porque puede aprovechar la captación previa y puede acceder instantáneamente a cualquier elemento de la matriz por su índice.