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

Python: how to get size of all objects in current namespace?

我有一些代码是 运行 来自我自己的程序包,但该程序使用的内存 (60GB) 比应有的多得多。我如何打印当前命名空间中所有对象的大小(以字节为单位),以便尝试找出使用此内存的位置?

我尝试了

from pympler import asizeof

for objname in dir():
    print(asizeof.asizeof(thing)/1024) # print size in kb

但它不起作用,因为它只打印包含命名空间中对象名称的字符串的大小。有没有一种方法可以获取对命名空间中所有内容的对象引用以便使用此方法,或者是否有更好的方法来计算出什么正在使用内存?

dir() returns 仅存在于本地范围内的名称。使用 locals() function 将本地作用域作为字典获取:

for obj in locals().values():
        print(asizeof.asizeof(obj) / 1024)

请注意,在函数之外,locals()globals() 的映射相同。

如果字典中有asizeof(),你想过滤掉:

for name, obj in locals().items():
    if name != 'asizeof':
        print(asizeof.asizeof(obj) / 1024)

dir() 不带参数在功能上等同于 sorted(locals())(本地名称空间的键的排序列表)。

您可以使用 gc.get_objects() 只获取收集器跟踪的所有对象,而不仅仅是特定命名空间中的对象。我首先使用它来计算每种类型的实例数,因为这本身可能会给您一些线索。

from collections import Counter
c = Counter(type(o) for o in gc.get_objects())
print(c.most_common(20))

然后您可能会向下钻取以找到任何可能的可疑对象的大小。

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

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