1. 程式人生 > >python類與對象-如何為創建大量實例節省內存

python類與對象-如何為創建大量實例節省內存

兩個類 添加屬性 __slots__ python類 如何 實用 技巧 nbsp name

如何為創建大量實例節省內存

問題舉例

在網絡遊戲中,定義玩家類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實用編程技巧進階

python類與對象-如何為創建大量實例節省內存