📜  如何在Python中查找对象的大小?(1)

📅  最后修改于: 2023-12-03 15:08:57.453000             🧑  作者: Mango

如何在Python中查找对象的大小?

在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中查找对象大小的方法介绍。