📅  最后修改于: 2023-12-03 15:08:57.453000             🧑  作者: Mango
在Python中,可以使用sys.getsizeof()
函数来查找对象的大小。
这个函数返回对象占用的内存大小,单位为字节。
以下是使用sys.getsizeof()
函数查找对象大小的示例代码:
import sys
# 字符串对象
s = 'hello world'
print(sys.getsizeof(s)) # 输出:54
# 列表对象
l = [1, 2, 3, 4, 5]
print(sys.getsizeof(l)) # 输出:96
# 字典对象
d = {'name': 'Python', 'version': 3.9}
print(sys.getsizeof(d)) # 输出:240
需要注意的是,sys.getsizeof()
函数返回的是对象本身占用的内存大小,并不包括对象引用的其他对象的大小。例如,对于一个包含多个元素的列表对象,sys.getsizeof()
函数只会计算列表对象本身占用的内存大小,而不会计算列表元素所引用的对象的大小。
因此,如果需要计算一个复杂对象的总大小,需要使用递归的方式对其包含的所有对象进行遍历,并将每个对象的大小累加起来。
以下是使用递归方式计算复杂对象大小的示例代码:
import sys
import collections
def get_total_size(obj, seen=None):
"""返回对象及其包含的所有对象的大小之和"""
size = sys.getsizeof(obj) # 计算对象本身的大小
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
# 处理已经遍历过的对象,避免重复计算大小
return 0
seen.add(obj_id)
# 递归遍历对象的成员,计算每个成员的大小并累加到总大小中
if isinstance(obj, (list, tuple, set)):
for item in obj:
size += get_total_size(item, seen)
elif isinstance(obj, dict) or isinstance(obj, collections.defaultdict):
for key, value in obj.items():
size += get_total_size(key, seen)
size += get_total_size(value, seen)
else:
# 对于其他类型的对象,应该遍历其成员以便能够计算引用的其他对象的大小
pass
return size
# 遍历一个包含多层对象的复杂对象
o = {
'name': 'o',
'children': [
{'name': 'o1', 'value': 1},
{'name': 'o2', 'value': 2, 'child': {'name': 'o2.1', 'value': 3}}
]
}
print(get_total_size(o)) # 输出:726
以上是在Python中查找对象大小的方法介绍。