Lista de Python vs. Array, ¿cuándo usarlo?

Si está creando una matriz 1d, puede implementarla como una lista, o bien usar el módulo ‘matriz’ en la biblioteca estándar. Siempre he usado listas para arrays 1d.

¿Cuál es la razón o circunstancia en la que me gustaría usar el módulo de matriz en su lugar?

¿Es para el rendimiento y la optimización de la memoria, o me falta algo obvio?

Básicamente, las listas de Python son muy flexibles y pueden contener datos arbitrarios completamente heterogéneos, y pueden agregarse de manera muy eficiente, en tiempo constante amortizado . Si necesita reducir y boost su lista de manera eficiente y sin problemas, son el camino a seguir. Pero usan mucho más espacio que los arrays C.

El tipo array.array , por otro lado, es solo una envoltura delgada en arrays C. Solo puede contener datos homogéneos, todos del mismo tipo, por lo que utiliza solo bytes de memoria de sizeof(one object) * length . Principalmente, debe usarlo cuando necesite exponer una matriz de C a una extensión o una llamada del sistema (por ejemplo, ioctl o fctnl ).

array.array también es una forma razonable de representar una cadena mutable en Python 2.x ( array('B', bytes) ). Sin embargo, Python 2.6+ y 3.x ofrece una cadena de bytes mutable como bytearray .

Sin embargo, si desea realizar cálculos matemáticos en una matriz homogénea de datos numéricos, entonces es mucho mejor utilizar NumPy, que puede vectorizar automáticamente las operaciones en matrices complejas multidimensionales.

Para array.array historia : array.array es útil cuando necesita una matriz de datos en C homogénea por otras razones que no sean matemáticas .

Para casi todos los casos, la lista normal es la opción correcta. El módulo de arrays se parece más a una envoltura delgada sobre arrays de C, que le brinda tipos de contenedores fuertemente tipificados (ver documentos ), con acceso a más tipos de tipo C, como firmas / unsigned short o double, que no son parte de la estructura en tipos Yo diría que use el módulo de arrays solo si realmente lo necesita, en todos los demás casos siga con las listas.

El módulo de arreglos es una de esas cosas que probablemente no necesite si no sabe por qué lo usaría (¡y tome nota de que no estoy tratando de decir eso de manera condescendiente!) . La mayoría de las veces, el módulo de matriz se utiliza para interactuar con el código C. Para darle una respuesta más directa a su pregunta sobre el rendimiento:

Las matrices son más eficientes que las listas para algunos usos. Si necesita asignar una matriz que SABES no cambiará, entonces las matrices pueden ser más rápidas y usar menos memoria. GvR tiene una anécdota de optimización en la que el módulo de matriz resulta ser el ganador (lectura larga, pero vale la pena).

Por otro lado, parte de la razón por la que las listas consumen más memoria que las matrices es que Python asignará algunos elementos adicionales cuando se utilicen todos los elementos asignados. Esto significa que agregar elementos a las listas es más rápido. Por lo tanto, si planea agregar elementos, una lista es el camino a seguir.

TL; DR Sólo usaría una matriz si tenía una necesidad de optimización excepcional o si necesita una interfaz con el código C (y no puede usar pyrex ).

Según tengo entendido, las matrices se almacenan de manera más eficiente (es decir, como bloques contiguos de memoria en comparación con los punteros a los objetos de Python), pero no tengo conocimiento de ningún beneficio de rendimiento. Además, con las matrices debe almacenar primitivas del mismo tipo, mientras que las listas pueden almacenar cualquier cosa.

¡Es un intercambio!

Pros de cada uno:

lista

  • flexible
  • puede ser heterogéneo

array (ej: numpy array)

  • matriz de valores uniformes
  • homogéneo
  • compacto (en tamaño)
  • eficiente (funcionalidad y velocidad)
  • conveniente

Las matrices de bibliotecas estándar son útiles para la E / S binaria, como la traducción de una lista de entradas a una cadena para escribir, por ejemplo, un archivo de onda. Dicho esto, como muchos ya han señalado, si va a hacer un trabajo real, debería considerar el uso de NumPy.

La matriz solo se puede utilizar para tipos específicos, mientras que las listas se pueden usar para cualquier objeto.

Las matrices también pueden solo datos de un tipo, mientras que una lista puede tener entradas de varios tipos de objetos.

Las matrices también son más eficientes para algunos cálculos numéricos.

Si va a utilizar arrays, considere los paquetes numpy o scipy, que le brindan arrays con mucha más flexibilidad.

Una diferencia importante entre la matriz numpy y la lista es que los segmentos de la matriz son vistas en la matriz original. Esto significa que los datos no se copian, y cualquier modificación a la vista se reflejará en la matriz de origen.