Python:如何获取当前命名空间中所有对象的大小?

Som*_*ist 3 python size memory-leaks memory-management introspection

我有一些代码,我从我自己的包运行,程序使用了比它应有的更多的内存(60GB).如何在当前命名空间中打印所有对象的大小(以字节为单位),以便尝试计算出使用此内存的位置?

我尝试了类似的东西

from pympler import asizeof

for objname in dir():
    print(asizeof.asizeof(thing)/1024) # print size in kb
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为它只打印包含命名空间中对象名称的字符串的大小.有没有办法获取对象引用命名空间中的所有内容以便使用此方法,还是有更好的方法来计算使用内存的内容?

oto*_*can 8

如果您更喜欢使用标准库并且还希望它们按大小排序:

import sys
objects=[]
for name,obj in locals().items():
   objects.append([name,sys.getsizeof(obj)])
sorted(objects,key=lambda x: x[1],reverse=True)
Run Code Online (Sandbox Code Playgroud)

  • 我似乎得到了“运行时错误:字典在迭代期间改变了大小”。因此,我将所有变量放在命名空间“ns”中,并将“locals()”替换为“ns”。这似乎工作得很好 (2认同)

Mar*_*ers 6

dir()仅返回本地范围中存在的名称.使用该locals()函数将本地范围作为字典:

for obj in locals().values():
        print(asizeof.asizeof(obj) / 1024)
Run Code Online (Sandbox Code Playgroud)

注意,在函数之外,locals()与映射相同globals().

如果asizeof()在词典中,您想要将其过滤掉:

for name, obj in locals().items():
    if name != 'asizeof':
        print(asizeof.asizeof(obj) / 1024)
Run Code Online (Sandbox Code Playgroud)

dir()没有参数在功能上等同于sorted(locals())(本地命名空间的键的排序列表).