Lista de Python versus matriz: ¿cuándo usarla?
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?
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, float
o uint64_t
).
El array.array
tipo, 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) * length
bytes de memoria. Principalmente, debe usarlo cuando necesite exponer una matriz C a una extensión o una llamada al 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 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.array
es útil cuando se necesita una matriz C homogénea de datos por motivos distintos a los matemáticos .
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.
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 ).
¡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