Lista de Python versus matriz: ¿cuándo usarla?

Resuelto Corey Goldberg asked hace 16 años • 11 respuestas

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

¿Cuál es el motivo o circunstancia por la que me gustaría utilizar el módulo de matriz?

¿Es para optimizar el rendimiento y la memoria, o me falta algo obvio?

Corey Goldberg avatar Oct 07 '08 03:10 Corey Goldberg
Aceptado

Básicamente, las listas de Python son muy flexibles y pueden contener datos arbitrarios completamente heterogéneos, y se pueden agregar de manera muy eficiente, en tiempo constante amortizado . Si necesita reducir y hacer crecer su lista de manera eficiente y sin complicaciones, son el camino a seguir. Pero utilizan mucho más espacio que las matrices C , en parte porque cada elemento de la lista requiere la construcción de un objeto Python individual, incluso para datos que podrían representarse con tipos C simples (por ejemplo, floato uint64_t).

El array.arraytipo, por otro lado, es sólo una fina envoltura en las matrices C. Sólo puede contener datos homogéneos (es decir, todos del mismo tipo) y por eso utiliza sólo sizeof(one object) * lengthbytes de memoria. Principalmente, debe usarlo cuando necesite exponer una matriz C a una extensión o una llamada al sistema (por ejemplo, ioctlo fctnl).

array.arrayTambié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 ofrecen una cadena de bytes mutable como bytearray.

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

Para resumir : array.arrayes útil cuando se necesita una matriz C homogénea de datos por motivos distintos a los matemáticos .

Dan Lenski avatar Oct 06 '2008 23:10 Dan Lenski

En casi todos los casos, la lista normal es la elección correcta. El módulo de matrices es más como una envoltura delgada sobre las matrices C, que le brindan una especie de contenedores fuertemente tipados (ver documentos ), con acceso a más tipos similares a C, como cortos o dobles firmados/sin firmar, que no son parte de la compilación. -en tipos. Yo diría que use el módulo de matrices solo si realmente lo necesita; en todos los demás casos, quédese con las listas.

André avatar Oct 06 '2008 20:10 André

El módulo de matriz es una de esas cosas que probablemente no necesites si no sabes por qué lo usarías (¡y toma en cuenta que no estoy tratando de decir eso de una 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 SABE que no cambiará, entonces las matrices pueden ser más rápidas y utilizar menos memoria. GvR tiene una anécdota de optimización en la que el módulo de matriz resulta 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 porque 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. Entonces, si planea agregar elementos, una lista es el camino a seguir.

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

Jason Baker avatar Oct 07 '2008 14:10 Jason Baker

¡Es una compensación!

ventajas de cada uno:

lista

  • flexible
  • puede ser heterogéneo

matriz (por ejemplo: matriz numerosa)

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