python: cómo mostrar el tamaño de todas las variables

2 minutos de lectura

avatar de usuario
usuario278016

Quiero imprimir el tamaño de la memoria de todas las variables en mi alcance simultáneamente.

Algo similar a:

for obj in locals().values():
    print sys.getsizeof(obj)

Pero con nombres de variables antes de cada valor para que pueda ver qué variables necesito eliminar o dividir en lotes.

¿Ideas?

avatar de usuario
jan-glx

Un poco más de código, pero funciona en Python 3 y ofrece una salida ordenada y legible por humanos:

import sys
def sizeof_fmt(num, suffix='B'):
    ''' by Fred Cirera,  https://stackoverflow.com/a/1094933/1870254, modified'''
    for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:
        if abs(num) < 1024.0:
            return "%3.1f %s%s" % (num, unit, suffix)
        num /= 1024.0
    return "%.1f %s%s" % (num, 'Yi', suffix)

for name, size in sorted(((name, sys.getsizeof(value)) for name, value in locals().items()),
                         key= lambda x: -x[1])[:10]:
    print("{:>30}: {:>8}".format(name, sizeof_fmt(size)))

Salida de ejemplo:

                  umis:   3.6 GiB
       barcodes_sorted:   3.6 GiB
          barcodes_idx:   3.6 GiB
              barcodes:   3.6 GiB
                  cbcs:   3.6 GiB
         reads_per_umi:   1.3 GiB
          umis_per_cbc:  59.1 MiB
         reads_per_cbc:  59.1 MiB
                   _40:  12.1 KiB
                     _:   1.6 KiB

  • ¡Agradable! ¿Puedes explicar qué son estos _40 ¿son? A mí me muestra múltiples _\d+ filas Algunos parecen tener exactamente el mismo tamaño que una variable con nombre, otros no.

    – Más

    13 de febrero de 2019 a las 9:52

  • @MoRe estas son (probablemente) variables temporales que contienen la salida de las celdas del cuaderno jupyter. ver documentación

    – jan-glx

    14 de febrero de 2019 a las 10:37

  • “Obviamente, este sistema puede generar una gran demanda de memoria en su sistema, ya que evita que el recolector de basura de Python elimine los resultados calculados previamente. Puede controlar cuántos resultados se guardan en la memoria con la opción de configuración InteractiveShell.cache_size. Si lo establece en 0, el almacenamiento en caché de salida está deshabilitado. También puede utilizar el %reset y %xdel magias para borrar elementos grandes de la memoria”

    – jan-glx

    14 de febrero de 2019 a las 10:39

  • Este fragmento es realmente útil, aunque mis variables totalizaron aproximadamente 5,1 GB, mientras que el uso de memoria según resource.getrusage rondaba los 10,9 GB. Esto está en Google Colab. ¿Qué podría estar explicando el resto del uso de la memoria?

    – demongolem

    23 de marzo de 2020 a las 16:17

  • @gocen: si. 6340*200*200 dobles *64 bits/doble / (8 bits/byte) / (2^30 bytes por GB) = 1,889 GB

    – jan-glx

    31 de marzo de 2020 a las 20:57

avatar de usuario
zcuadrado

Puede iterar sobre la clave y el valor de un diccionario usando .items()

from __future__ import print_function  # for Python2
import sys

local_vars = list(locals().items())
for var, obj in local_vars:
    print(var, sys.getsizeof(obj))

  • Esto resultó en RuntimeError: el diccionario cambió de tamaño durante la iteración

    – Pradeep Singh

    25 de febrero de 2020 a las 16:06


  • Usar local_vars = list(locals().items()) para evitar RuntimeError.

    – TomDLT

    7 de abril de 2020 a las 1:38

  • para alguien que se pregunta cuál es la unidad de tamaño: es bytes. sys.getsizeof().

    – xanjay

    29 de mayo de 2020 a las 18:08

¿Ha sido útil esta solución?