python記憶體技巧 使用 slots

2021-10-11 13:14:32 字數 1240 閱讀 7352

__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的關聯。而字段值與原來的方式無差別,因為畢竟各個例項的欄位名一樣,可以統一存放,而字段值並不都是一樣,當然對於字段值也一樣的我們也統一儲存(因為底層字典都是與類這個型別關聯,而不是與每個例項的__dict__關聯)。但對於資料量龐大的情況(數百萬級以上),能夠非常顯著的節省記憶體空間(25.5gb -> 16.2gb)。

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

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

加入__slots__後:底層例項和字典是多對一的關係(重複的部分)。

使用slot scope複製vue中slot內容

有時候我們的vue元件需要複製使用者傳遞的內容。比如我們工程裡面的輪播元件需要使用複製的slot來達到迴圈滾動的效果 使用者關注輪播內容的靜態效果,元件負責讓其滾動起來 元件 使用者 123這種實現方式對於初始化的資料是沒問題的,但是不支援slot內容的動態繫結,這是因為 因此當元件使用者在宣告節點...

python節省記憶體技巧 使用 slots

slots 作用 slots 有乙個作用是 限制類例項繫結的屬性,但是它有乙個更重要的作用就是節省記憶體,當然更適用於資料量大的情況 萬量級以上 slots 節省記憶體的原理 class measurement def init self,x,y,value self.x x self.y y se...

python用法技巧 python使用技巧 一

一 plt繪製條形圖 importmatplotlib.pyplot as pltimport matplotlib 引入 設定label list 2014 2015 2016 2017 橫座標刻度顯示值 num list1 20,30,15,35 縱座標值1 rects1 plt.bar ran...