una - Lista de Python vs. Array-¿Cuándo usarlo?
metodos de listas en python (9)
¡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
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 arreglos 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 se pueden agregar de manera muy eficiente, en tiempo constante amortizado . Si necesita reducir y hacer crecer su matriz 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 usar 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 C homogénea por razones distintas a las matemáticas .
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 decirlo 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 necesitas 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 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 artículos, una lista es el camino a seguir.
TL; DR Solo 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 ).
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.
Las matrices de bibliotecas estándar son útiles para E / S binarias, 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.
Para casi todos los casos, la lista normal es la opción correcta. El módulo de arrays es más como una envoltura delgada sobre arrays de C, que le da tipos de contenedores fuertemente tipados (ver docs ), con acceso a más tipos de tipo C, como firmas / sin firma, cortas o dobles, 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.
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.
Si va a utilizar matrices, tenga en cuenta los paquetes numpy o scipy, que le brindan matrices con mucha más flexibilidad.
Una diferencia importante entre la matriz numpy y la lista es que los cortes de 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.