问题背景:在游戏开发中,有一个玩家类Player,每有一个在线玩家,在服务器内则有一个player的实例,当在线的人数很多时,将产生大量实例(百万级)
解决方向:在实例化时,支持动态绑定的__dict_字段占用了很大的空间,如果要把dict去掉,加入__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
# 实例化两个类
p1 = Player("1","zs",1)
p2 = Player2("2","ls",1)
"""
跟踪内存的使用
"""
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]:
print(start)