當例項執行過多時,會消耗大量的記憶體,如何去降低這些大量例項的記憶體開銷呢?
解決方案:定義了 __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
# 主程式入口
if __name__ ==
'__main__'
: p1= player(
"1",,1
) p2 = player2(
"2",
"good",1
)
列印其屬性:兩者相差乙個,使用集合相減,可以看到差了哪乙個:
# print(dir(p1))
# print(dir(p2))
# print(len(dir(p1))) # 29
# print(len(dir(p2))) # 28
'''集合 ----》差集
weakref 弱引用
dict 動態繫結屬性
'''# print(set(dir(p1)) - set(dir(p2))) #
也可以給兩個例項新增屬性和刪除屬性
# 動態為p1新增屬性
p1.__dict__[
"level"]=
1print
(p1.__dict__)
# 動態刪除屬性
del p1.__dict__[
"level"
]print
(p1.__dict__)
'''p2不能動態繫結屬性 由於__slots__唯讀
'''# print(p2.__dict__) # 報錯
# p2.level = 1 # 不能動態繫結 報錯
# p2.__slots__ = (1,) # 報錯 唯讀
`
sys模組可以檢視例項的記憶體大小
import sys
print
(sys.getsizeof(p1.__dict__)
)# 240
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
]:# 是指前10個快照
print
(start)
使用__dict__字典主要是為了提公升查詢效率,所以必須使用空間換時間,少量的例項,使用字典儲存,問題不大。但如果是數百萬個例項,字典的總空間就比較大。__slote__相當於告訴直譯器,例項的屬性都叫什麼,而且既然需要節省記憶體,推薦定義時使用元組,而不是列表
slots__不影響子類例項,不會繼承,除非子類裡面自己定義了__slots.
Redis記憶體大小及淘汰策略
目錄 redis占用記憶體大小 redis的記憶體淘汰 如何獲取及設定記憶體淘汰策略 lru演算法 lru在redis中的實現 lfu演算法 我們知道redis是基於記憶體的key value資料庫,因為系統的記憶體大小有限,所以我們在使用redis的時候可以配置redis能使用的最大的記憶體大小。...
位元組,字元及占用記憶體大小情況
一 位元組 的定義 位元組 byte 是一種計量單位,表示資料量多少,它是計算機資訊技術用於計量儲存容量的一種計量單位。二 字元 的定義 字元是指計算機中使用的文字和符號,比如1 2 3 a b c 等等。三 位元組 與 字元 它們完全不是乙個位面的概念,所以兩者之間沒有 區別 這個說法。不同編碼裡...
enum的記憶體大小
enum在記憶體中占用多少儲存空間,為什麼在使用enum型別的時候不用寫上enum的名字呢,想struct一樣呼叫?在網上搜尋了一下,找到了想要的結論!enum定義類似與下面這樣 enum color 用起來可能像這樣 color color red switch color 先說為什麼red,不能...