节省内存
当实例运行过多时,会消耗大量的内存,如何去降低这些大量实例的内存开销呢?
解决方案:定义了 __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.