python節省記憶體技巧 使用 slots

2021-10-13 06:07:10 字數 1237 閱讀 6146

__slots__作用

__slots__有乙個作用是:限制類例項繫結的屬性,但是它有乙個更重要的作用就是節省記憶體,當然更適用於資料量大的情況(萬量級以上)。

__slots__節省記憶體的原理

class measurement:

def __init__(self, x, y, value):

self.x = x

self.y = y

self.val = value

m2 = measurement(7, 10, "crazy")

m2.other = true

其實,對類的變數值進行初始化,底層是通過乙個指標指向__dict__(裡面包含潛在的欄位名和字段值)。舉個例子,上面的程式底層實現過程如下:

我們也可以通過程式檢視這一底層形式:

print(m2.__dict__) #

這就是python自定義變數底層的乙個基本實現。通過對這一底層理解,我們就會知道,如果我們的例項有數百萬個,那麼底層會有相應數百萬個字典擁有相同的key值(知識value值不同),這時非常耗記憶體的,這時候__slots__就發揮它的作用了。

通過__slots__,我們可以稍微調整一下類,以改變類中字段的儲存方式,廢棄原來那種耗費記憶體的1對1重複的字典分配方式。具體如下:

class measurement:

__slots__ = [『x『, 『y『, 『val『]

def __init__(self, x, y, value):

self.x = x

self.y = y

self.val = value

這樣我們底層的實現就會變為如下方式:

我們可以看出,現在欄位名是與measurement類這個型別相關聯,而不是原來的與相應的例項1對1的關聯。而字段值與原來的方式無差別,因為畢竟各個例項的欄位名一樣,可以統一存放,而字段值不一樣,我們還得用1對1的形式儲存字段值。但對於資料量龐大的情況(數百萬級以上),節省重複的欄位名儲存已經能夠非常顯著的節省記憶體空間了(25.5gb -> 16.2gb)。

以上就是__slots__能夠節省記憶體的原理,主要還是要搞清楚python的類變數初始化的底層操作是通過字典儲存後相關聯這一方式進行的,__slots__只是改變了字典key,value與例項相關聯的方式,可以總結如下:

預設變數例項化方法:底層例項和字典是一對一的關係

加入__slots__後:底層例項和字典中的value是一對一的關係,和字典中的key是多對一的關係。

原文:

使用虛函式節省記憶體

在乙個類層次中,如果最頂層基類需要定義某個屬性,最一般的方法就是在頂層的類中定義 乙個資料成員來儲存該屬性的值,然後在頂層基類中定義乙個非虛方法訪問該屬性的值。但是如果物件的數量非常多時,這種方式會造成一定的記憶體開銷。有一種特殊的情況 乙個物件的某個屬性的值完全由其所屬的類決定。在這種情況下,可以...

Python 節省記憶體的迴圈寫法 一

0 前言 說到處理迴圈,我們習慣使用 for,while 等,比如依次列印每個列表中的字元 lis i love python for i in lis print i 輸出 i love python 在列印內容位元組數較小時,全部載入記憶體後,再列印,沒有問題。可是,如果現在有成千上百萬條車輛行...

python 百萬級別類例項實現節省記憶體

案例 某網路遊戲中,定義了玩家類player id,name,status 每當有乙個玩家,就會在伺服器建立乙個player例項 如何降低這些例項的大量例項的記憶體開銷?解決方案 定義類的 slots 屬性,它是用來宣告例項屬性名字的列表 class player object slots name...