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	est.py:0: size=7056 KiB, count=100002, average=72 B
#C:PythonPython37lib	racemalloc.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	est.py:0: size=16.8 MiB, count=299994, average=59 B
#C:PythonPython37lib	racemalloc.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实用编程技巧进阶

原文地址:https://www.cnblogs.com/marton/p/10778030.html