Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

861
Vistas
¿La matriz NumPy realmente ocupa menos memoria que la lista de python?

Por favor refiérase a la siguiente ejecución -

 import sys _list = [2,55,87] print(f'1 - Memory used by Python List - {sys.getsizeof(_list)}') narray = np.array([2,55,87]) size = narray.size * narray.itemsize print(f'2 - Memory usage of np array using itemsize - {size}') print(f'3 - Memory usage of np array using getsizeof - {sys.getsizeof(narray)}')

Esto es lo que obtengo como resultado

 1 - Memory used by Python List - 80 2 - Memory usage of np array using itemsize - 12 3 - Memory usage of np array using getsizeof - 116

Una forma de cálculo sugiere que la matriz numpy está consumiendo demasiada menos memoria, pero otra dice que está consumiendo más que la lista normal de python. ¿No debería estar usando getSizeOf con una matriz numpy? ¿Qué estoy haciendo mal aquí?

Editar: acabo de verificar, una lista de python vacía consume 56 bytes, mientras que una matriz np vacía 104. ¿Se está utilizando este espacio para señalar los métodos y atributos integrados asociados?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

El cálculo usando:

 size = narray.size * narray.itemsize

no incluye la memoria consumida por los atributos que no son elementos del objeto de matriz. Esto se puede verificar con la documentación de ndarray.nbytes :

 >>> x = np.zeros((3,5,2), dtype=np.complex128) >>> x.nbytes 480 >>> np.prod(x.shape) * x.itemsize 480

En el enlace anterior, se puede leer que ndarray.nbytes :

No incluye la memoria consumida por los atributos que no son elementos del objeto de matriz.

Tenga en cuenta que del código anterior puede concluir que su cálculo excluye los atributos que no son elementos dado que el valor es igual al de ndarray.nbytes .

Se puede encontrar una lista de los atributos que no son elementos en la sección Atributos de matriz , incluido aquí para completar:

ndarray.flags Información sobre el diseño de memoria de la matriz.
ndarray.shape Tupla de dimensiones de matriz.
ndarray.strides Tupla de bytes para avanzar en cada dimensión al atravesar una matriz.
ndarray.ndim Número de dimensiones de matriz.
ndarray.data Objeto de búfer de Python que apunta al inicio de los datos de la matriz.
ndarray.size Número de elementos en la matriz.
ndarray.itemsize Longitud de un elemento de matriz en bytes.
ndarray.nbytes Total de bytes consumidos por los elementos de la matriz.
ndarray.base Objeto base si la memoria es de algún otro objeto.

Con respecto a sys.getsizeof , se puede leer en la documentación (énfasis mío) que:

Solo se tiene en cuenta el consumo de memoria directamente atribuido al objeto , no el consumo de memoria de los objetos a los que se refiere.

over 4 years ago · Santiago Trujillo Denunciar

0

Debido a que las matrices numpy tienen formas, pasos y otras variables miembro que definen el diseño de los datos, es razonable que (podría) requerir algo de memoria adicional para esto.

Una list , por otro lado, no tiene un tipo o forma específica, etc.

Sin embargo, si comienza a agregar elementos en una lista en lugar de simplemente escribirlos como una matriz, y también va a un mayor número de elementos, por ejemplo, 1e7, ¡verá un comportamiento diferente!

Caso de ejemplo:

 import numpy as np import sys N = int(1e7) narray = np.zeros(N); mylist = [] for i in range(N): mylist.append(narray[i]) print("size of np.array:", sys.getsizeof(narray)) print("size of list :", sys.getsizeof(mylist))

En mi PC (ASUS) Ubuntu 20.04 obtengo:

 size of np.array: 80000104 size of list : 81528048

¡ Tenga en cuenta que no solo es importante la huella de memoria en la eficiencia de una aplicación! El diseño de datos a veces es mucho más importante.

over 4 years ago · Santiago Trujillo Denunciar

0

La búsqueda en [numpy]getsizeof produce muchos posibles duplicados.

Los puntos básicos son:

  1. una lista es un contenedor, y getsizeof docs nos advierte que solo devuelve el tamaño del contenedor, no el tamaño de los elementos a los que hace referencia. Entonces, por sí mismo, es una medida poco confiable para el tamaño total de una lista (o tupla o dict).

  2. getsizeof es una medida bastante buena de matrices, si se tienen en cuenta los aproximadamente 100 bytes de "sobrecarga". Esa sobrecarga será una gran parte de una matriz pequeña y una cosa menor cuando se mira una grande. nbytes es la forma más sencilla de juzgar el uso de la memoria de la matriz.

  3. Pero para las views , el búfer de datos se comparte con la base y no cuenta cuando se usa getsizeof .

  4. Las matrices de tipo de objeto contienen referencias como listas, por lo que se aplica la misma getsizeof .

En general, creo que comprender cómo se almacenan las matrices y las listas es una forma más útil de juzgar su uso de memoria respectivo. Concéntrese más en la eficiencia computacional que en el uso de la memoria. Para cosas pequeñas y usos iterativos, las listas son mejores. Las matrices son mejores cuando son grandes y se utilizan métodos de matriz para realizar los cálculos.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda