Básicamente, las listas de Python son muy flexibles y pueden contener datos completamente heterogéneos y arbitrarios, y se pueden agregar de manera muy eficiente, en tiempo constante amortizado . Si necesita reducir y hacer crecer su lista de manera eficiente en el tiempo y sin problemas, son el camino a seguir. Pero utilizan un espacio mucho más que C matrices .
El array.array
tipo, por otro lado, es solo una envoltura delgada en matrices C. Solo puede contener datos homogéneos, todos del mismo tipo, por lo que solo utiliza 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 ofrece una cadena de bytes mutable como bytearray
.
Sin embargo, si desea hacer 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 multidimensionales complejas.
En pocas palabras : array.array
es útil cuando necesita una matriz de datos C homogénea por otras razones que no sean matemáticas .
sizeof(element)
× (número de elementos) bytes, más un pequeño encabezado fijo para la sobrecarga. Sin embargo, ndarray tiene algunas opciones avanzadas para manejar matrices poco contiguas y dispersas, y creo que algunas estrategias conectables para asignar memoria para matrices grandes ... algunas de estas características avanzadas harán que el usuario tenga menos memoria, mientras que otras mejorarán el rendimiento al usar más memoria.Para casi todos los casos, la lista normal es la elección correcta. El módulo de matrices se parece más a una envoltura delgada sobre matrices en C, que le dan un tipo de contenedores fuertemente tipados (ver documentos ), con acceso a más tipos similares a C, como con signo / sin signo, corto o doble, que no son parte de la construcció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.
fuente
array
está destinado a hacer matemáticas . Si intentas NumPy'sndarray
para sumar una matriz de 10 ^ 8 números, se irá por completolist
. @tzot tiene la idea correcta de por qué la integraciónarray
es lenta para las matemáticas.El módulo de matriz es una de esas cosas que probablemente no necesite si no sabe por qué lo usaría (¡y tenga en cuenta que no estoy tratando de decir eso de manera condescendiente!) . La mayoría de las veces, el módulo de matriz se usa 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á, 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 cual las listas consumen más memoria que las matrices es porque python asignará algunos elementos adicionales cuando se usen 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 ).
fuente
Ventajas de cada uno:
lista
matriz (por ejemplo: matriz numpy)
fuente
Entiendo que las matrices se almacenan de manera más eficiente (es decir, como bloques contiguos de memoria frente a punteros a objetos Python), pero no conozco ningún beneficio de rendimiento. Además, con las matrices debe almacenar primitivas del mismo tipo, mientras que las listas pueden almacenar cualquier cosa.
fuente
Las matrices de biblioteca estándar son útiles para E / S binarias, como traducir una lista de entradas a una cadena para escribir, por ejemplo, en un archivo wave. Dicho esto, como muchos ya han notado, si vas a hacer un trabajo real, entonces deberías considerar usar NumPy.
fuente
Si va a utilizar matrices, considere los paquetes numpy o scipy, que le brindan matrices con mucha más flexibilidad.
fuente
La matriz solo se puede usar 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.
fuente
Una diferencia importante entre la matriz numpy y la lista es que las secciones de la matriz son vistas en la matriz original. Esto significa que los datos no se copian y cualquier modificación de la vista se reflejará en la matriz de origen.
fuente
Esta respuesta resumirá casi todas las consultas sobre cuándo usar List and Array:
La principal diferencia entre estos dos tipos de datos son las operaciones que puede realizar en ellos. Por ejemplo, puede dividir una matriz por 3 y dividirá cada elemento de la matriz por 3. No se puede hacer lo mismo con la lista.
La lista es parte de la sintaxis de Python, por lo que no es necesario declararla, ya que debe declarar la matriz antes de usarla.
Puede almacenar valores de diferentes tipos de datos en una lista (heterogéneos), mientras que en Array solo puede almacenar valores del mismo tipo de datos (homogéneos).
Las matrices son ricas en funcionalidades y rápidas, se usan ampliamente para operaciones aritméticas y para almacenar una gran cantidad de datos, en comparación con la lista.
Las matrices toman menos memoria en comparación con las listas.
fuente
Con respecto al rendimiento, aquí hay algunos números que comparan listas de python, matrices y matrices numpy (todas con Python 3.7 en un Macbook Pro 2017). El resultado final es que la lista de Python es la más rápida para estas operaciones.
fuente