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

问题描述 投票:0回答:3

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

我尝试过类似的事情

from pympler import asizeof

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

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

python memory-management memory-leaks size introspection
3个回答
10
投票

dir()
仅返回本地范围内存在的名称。使用
locals()
函数
获取本地范围作为字典:

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())
(本地命名空间的键的排序列表)。


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)

2
投票

您可以使用

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

from collections import Counter
import gc

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

然后您可以深入查找任何可能嫌疑对象的大小。

© www.soinside.com 2019 - 2024. All rights reserved.