中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣使用python中的__slots__方法

發布時間:2020-11-09 10:57:47 來源:億速云 閱讀:222 作者:小新 欄目:編程語言

怎樣使用python中的__slots__方法?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!

__slots__的簡介

__slots__是可以在定義Python類時添加的屬性。

您可以使用對象實例可以擁有的可能屬性來定義插槽。

使用__slots__的方法如下:

class WithSlots:
    __slots__ = ('x', 'y')
 
    def __init__(self, x, y):
        self.x, self.y = x, y

使用__slots__的更高層次的最大原因是:

1.由于數據結構優化而更快地獲取和設置屬性;

2.減少了類實例的內存使用量。 不想使用它的某些原因是,

3.如果類具有在運行時更改的屬性(動態屬性),或者存在復雜的對象繼承樹

我們做個測試數據:

首先,我們先進行一些測試,以查看__slots__何時更快,從批量實例化開始。 使用Python的“ timeit”模塊和此代碼段,我們得到以下結果:

class WithoutSlots:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
 
class WithSlots:
    __slots__ = ('x', 'y', 'z')
 
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
 
def instance_fn(cls):
    def instance():
        x = cls(1, 2, 3)
return instance
Without Slots: 0.3909880230203271
With Slots: 0.31494391383603215
(averaged over 100000 iterations)

在這種情況下,使用slots的實例化速度稍快。 這很有意義,因為我們拒絕為給定對象的新實例創建__dict__。 字典通常比元組或列表有更多內存開銷。 讓我們嘗試一個具有更多與實例相關聯的屬性的類!

Without Slots: 1.5249411426484585
With Slots: 1.52750033326447
(averaged over 100000 iterations)

通常,使用__slots__并不能真正縮短實例化時間。 盡管不必創建__dict__,但是還有其他開銷需要我們稍后再使用的slots來完成,這導致了類似于從實際類中復制字典的運行時間。

當我們開始快速連續獲取和設置值時,真正的加速就起作用了:

def get_set_fn(cls):
    x = cls(list(range(26)))
    def get_set():
        x.y = x.z + 1
        x.a = x.b - 1
        x.d = x.q + 3
        x.i = x.j - 1
        x.z = x.y / 2
return get_set
Without Slots: 11.59717286285013
With Slots: 9.243316248897463
(averaged over 100000 iterations)

速度提高了20%以上! 如果測試范圍更廣(并且不總是訪問相同的屬性,且屬性的長度比單個字符長),則可以實現更大的加速。

內存使用情況

首先,讓我們測試元組和字典在內存中的增長方式之間的區別。 當使用__slots__知道給定實例可以存在哪些屬性時,它可以為與實例相關聯的描述符分配(而不必為每個新對象添加__dict__)。

Python中,很難描述對象實例使用的確切內存量:sys.getsizeof僅適用于基元和內置函數。 相反,我們將在名為“ Pympler”的庫中使用名為asizeof的函數。

import sys  #沒有這一句會報錯
sys.getsizeof(('a', 'b', 'c', 'd'))
>>> asizeof(('a', 'b', 'c', 'd'))
304
>>> asizeof({'a': 'b', 'c': 'd'})
512
>>> asizeof(tuple(string.ascii_lowercase))
1712
>>> dictionary
{'e': 'f', 'k': 'l', 'c': 'd', 'g': 'h', 'o': 'p', 'i': 'j', 's': 't', 'm': 'n', 'q': 'r', 'a': 'b', 'y': 'z', 'w': 'x', 'u': 'v'}
>>> asizeof(dictionary)
2320

我們在這里省略了__slots__示例的實現細節:我們沒有將一個元組用于描述符,一個元組用于值,而是將它們全部放在一個列表中。 但是,與元組和dict之間的差異相比,我們發現大小的差異并不大:

>>> asizeof(('a', 'b')) + asizeof(('c', 'd'))
352
為了更好的測量,當我們在上一個示例類的slots上實際運行asizeof時,會發生以下情況:
>>> w1 = WithoutSlots(1, 2, 3)
>>> asizeof(w1)
416
>>> w2 = WithSlots(4, 5, 6)
>>> asizeof(w2)
160

感謝各位的閱讀!看完上述內容,你們對怎樣使用python中的__slots__方法大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

剑河县| 渑池县| 大埔区| 玉环县| 胶南市| 长丰县| 平谷区| 伊春市| 来安县| 昌吉市| 钦州市| 邹平县| 兴海县| 云和县| 信阳市| 桂平市| 芒康县| 绩溪县| 周口市| 民勤县| 玉山县| 明光市| 古田县| 盐源县| 武鸣县| 三明市| 江华| 九龙城区| 遂宁市| 浦北县| 隆子县| 黄冈市| 墨江| 奉节县| 文成县| 英山县| 武川县| 中西区| 邹平县| 华池县| 普定县|