python类与对象-如何为创建大量实例节省内存
如何为创建大量实例节省内存
问题举例
在网络游戏中,定义玩家类Player(id, name, level...),
每个玩家在线将创建一个Player实例,当在线人数很多时,将产生大量实例,
如何降低这些实例的内存开销?
分析
通过类创建的对象一般有一个__dict__属性,它是一个字典,
在添加属性时创建,主要用来维护动态添加的属性,__dict__非常消耗内存
解决思路
定义类的__slots__属性,声明实例有哪些属性,提前分配内存空间,但是同时也关闭了动态添加属性的功能
代码
通过tracemalloc模块查看两个类创建100000实例所占用内存的对比
import tracemalloc class Player1(): __slots__ = ['uid', 'name', 'level'] def __init__(self, uid, name, level): self.uid = uid self.name = name self.level = level class Player2(): def __init__(self, uid, name, level): self.uid = uid self.name = name self.level = level tracemalloc.start() # start #la = [Player1(1,'tom',3) for _ in range(100000)] #D:\python\test.py:0: size=7056 KiB, count=100002, average=72 B #C:\Python\Python37\lib\tracemalloc.py:0: size=64 B, count=1, average=64 B #[Finished in 0.9s] lb = [Player2(1,'tom',3) for _ in range(100000)] #D:\python\test.py:0: size=16.8 MiB, count=299994, average=59 B #C:\Python\Python37\lib\tracemalloc.py:0: size=64 B, count=1, average=64 B #[Finished in 1.7s] # end snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('filename') for stat in top_stats[:10]: print(stat)
参考资料:python3实用编程技巧进阶