【问题标题】:python- how to display size of all variablespython-如何显示所有变量的大小
【发布时间】:2014-08-18 18:54:04
【问题描述】:

我想同时打印作用域内所有变量的内存大小。

类似于:

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

但是在每个值之前都有变量名,所以我可以看到我需要删除哪些变量或将其拆分为批次。

想法?

【问题讨论】:

    标签: python memory


    【解决方案1】:

    更多的代码,但在 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)))
    

    示例输出:

                      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
    

    【讨论】:

    • 不错!你能解释一下这些_40 是什么吗?对我来说,它显示了多个 _\d+ 行。有些似乎与命名变量具有完全相同的大小,有些则没有。
    • @MoRe 这些(可能)是保存 jupyter notebook 单元输出的临时变量。 see documentation
    • "这个系统显然可能会给您的系统带来大量内存需求,因为它会阻止 Python 的垃圾收集器删除任何先前计算的结果。您可以使用配置选项控制在内存中保留多少结果 @ 987654326@。如果将其设置为 0,则禁用输出缓存。您还可以使用 %reset%xdel 魔法从内存中清除大项目"
    • 这个 sn-p 非常有用,尽管我的变量总计高达 5.1 GB,而根据 resource.getrusage 的内存使用量约为 10.9 GB。这是在 Google Colab 中。其余的内存使用情况可能是什么原因?
    • @gocen:是的。 6340*200*200 双倍 *64 位/双倍 /(8 位/字节)/(每 GB 2^30 字节)= 1.889 GB
    【解决方案2】:

    您可以使用.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))
    

    【讨论】:

    • 这导致了 RuntimeError: dictionary changed size during iteration
    • 使用local_vars = list(locals().items()) 避免RuntimeError。
    • 如果有人想知道,大小的单位是什么:它的 字节sys.getsizeof().
    猜你喜欢
    • 2018-04-10
    • 2011-07-21
    • 2019-12-29
    • 2022-10-13
    • 2020-04-10
    • 2018-03-01
    • 2020-02-27
    • 2018-05-07
    相关资源
    最近更新 更多