python-如何显示所有变量的大小

use*_*016 27 python memory

我想同时打印我的范围内所有变量的内存大小.

类似的东西:

for obj in locals().values():
    print sys.getsizeof(obj)
Run Code Online (Sandbox Code Playgroud)

但是在每个值之前使用变量名称,因此我可以看到我需要删除哪些变量或分成批次.

想法?

zsq*_*are 35

您可以使用迭代迭代字典的键和值 .items()

from __future__ import print_function  # for Python2
for var, obj in locals().items():
    print(var, sys.getsizeof(obj))
Run Code Online (Sandbox Code Playgroud)

  • 对于有人想知道,大小的单位是什么:它的**字节**。[sys.getsizeof()](https://docs.python.org/2/library/sys.html#sys.getsizeof)。 (4认同)
  • 这导致运行时错误:字典在迭代期间更改了大小 (2认同)

jan*_*glx 32

更多代码,但在Python 3中工作,并提供有序的,人类可读的输出:

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)))
Run Code Online (Sandbox Code Playgroud)

示例输出:

                  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
Run Code Online (Sandbox Code Playgroud)

  • @MoRe 这些(可能)是保存 jupyter notebook 单元输出的临时变量。[参见文档](https://ipython.org/ipython-doc/3/interactive/reference.html#output-caching-system) (3认同)