第十七章:运行时特性-sys:系统特定配置-内存管理和限制-对象大小

本文通过实例演示了如何使用Python的sys模块来测量不同类型的对象所占用的内存大小,并介绍了如何实现一个定制类来准确计算包含属性的对象的实际大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

17.2.3.2 对象大小
了解一个对象有多少引用可以帮助开发人员发现环或内存泄漏,不过还不足以确定哪些对象消耗的内存最多。这需要知道对象有多大。

import sys


class MyClass:
    pass
objects= [
    [],(),{},'c','string',b'bytes',1,2.3,
    MyClass,MyClass(),
    ]
for obj in objects:
    print('{:>10}:{}'.format(type(obj).__name__,
                             sys.getsizeof(obj)))

getsizeof()会报告一个对象的大小(单位为字节)。
在这里插入图片描述
报告的定制类大小不包括属性值的大小。

import sys


class WithoutAttributes:
    pass


class WithAttributes:
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        return


without_attrs = WithoutAttributes()
print('WithoutAttributes:',sys.getsizeof(without_attrs))

with_attrs = WithAttributes()
print('WithAttributes:',sys.getsizeof(with_attrs))

这可能会让人对实际消耗的内存量有一个错误的印象。
在这里插入图片描述
对于一个类所用的空间,为了得到更全面的估计,这个模块提供了一个__sizeof__()方法来计算这个值,它会累计一个对象各个属性的大小。

import sys


class WithAttributes:
    def __init__(self):
        self.a = 'a'
        self.b = 'b'
        return

    def __sizeof__(self):
        return object.__sizeof__(self) + \
               sum(sys.getsizeof(v) for v in self.__dict__.values())

my_inst = WithAttributes()
print(sys.getsizeof(my_inst))

这个版本在计算对象大小时,会在对象基本大小的基础上加上存储在内部__dict__中的所有属性的大小。
运行结果:

156

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值