python----内存大小及消耗

节省内存

当实例运行过多时,会消耗大量的内存,如何去降低这些大量实例的内存开销呢?
解决方案:定义了 __slots__属性,声明实例有哪些属性(关闭动态绑定)

首先定义两个方法,作为两个实例

class player(object):
    def __init__(self,uid,name, status):
        self.uid = uid
        self.name = name
        self.status = status

class player2(object):
# 元组的内存消耗  比列表小
    __slots__ = ("uid", "name", "status")
    def __init__(self,uid,name, status):
        self.uid = uid
        self.name = name
        self.status = status

   # 主程序入口
if __name__ == '__main__':
    p1= player("1","happy",1)
    p2 = player2("2","good",1)

打印其属性:两者相差一个,使用集合相减,可以看到差了哪一个:

# print(dir(p1))
# print(dir(p2))

# print(len(dir(p1)))   # 29
# print(len(dir(p2)))   # 28
'''
集合   ----》差集
weakref  弱引用
dict  动态绑定属性 
'''
# print(set(dir(p1)) - set(dir(p2)))  # {'__dict__', '__weakref__'}

也可以给两个实例添加属性和删除属性

# 动态为p1添加属性
p1.__dict__["level"] = 1
print(p1.__dict__)  # {'uid': '1', 'name': 'happy', 'status': 1, 'level': 1}

# 动态删除属性
del p1.__dict__["level"]
print(p1.__dict__)  # {'uid': '1', 'name': 'happy', 'status': 1}

'''
p2不能动态绑定属性  由于__slots__只读
'''
# print(p2.__dict__)  # 报错
# p2.level = 1    # 不能动态绑定  报错
# p2.__slots__ = (1,)  # 报错 只读
`

查看内存大小

sys模块可以查看实例的内存大小

import sys
print(sys.getsizeof(p1.__dict__))  # 240

跟踪内存使用情况

import tracemalloc    #  跟踪内存使用情况
tracemalloc.start()  # 开始跟踪内存分配
# pla_1 = [player(1, 2, 3) for i in range(10000)]  # size=1722 KiB,
pla_2 = [player2(1,2,3) for i in range(10000)]  # size=711 KiB,

snapshot = tracemalloc.take_snapshot()  # 快照  当前内存分配
top = snapshot.statistics("filename")  # 快照对象统计  检测文件

for start in top[:10]:  # 是指前10个快照
    print(start)

使用__dict__字典主要是为了提升查询效率,所以必须使用空间换时间,少量的实例,使用字典存储,问题不大。但如果是数百万个实例,字典的总空间就比较大。__slote__相当于告诉解释器,实例的属性都叫什么,而且既然需要节省内存,推荐定义时使用元组,而不是列表
slots__不影响子类实例,不会继承,除非子类里面自己定义了__slots.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值