python類與對象-如何為創建大量實例節省內存
阿新 • • 發佈:2019-04-27
兩個類 添加屬性 __slots__ python類 如何 實用 技巧 nbsp name
如何為創建大量實例節省內存
問題舉例
在網絡遊戲中,定義玩家類Player(id, name, level...),
每個玩家在線將創建一個Player實例,當在線人數很多時,將產生大量實例,
如何降低這些實例的內存開銷?
分析
通過類創建的對象一般有一個__dict__屬性,它是一個字典,
在添加屬性時創建,主要用來維護動態添加的屬性,__dict__非常消耗內存
解決思路
定義類的__slots__屬性,聲明實例有哪些屬性,提前分配內存空間,但是同時也關閉了動態添加屬性的功能
代碼
通過tracemalloc模塊查看兩個類創建100000實例所占用內存的對比
importtracemalloc 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 _ inrange(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實用編程技巧進階
python類與對象-如何為創建大量實例節省內存