最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python 內存優(yōu)化

 更新時間:2020年08月17日 11:14:38   作者:Rocky0429  
這篇文章主要介紹了python 內存優(yōu)化的相關資料,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

寫在之前

圍繞類的話題,說是說不完的,僅在特殊方法,除了我們在前面遇到過的 __init__(),__new__(),__str__() 等之外還有很多。雖然它們只是在某些特殊的場景中才會用到,但是學會它們卻可以成為你熟悉這門語言路上的鋪路石。

所以我會在試圖介紹一些「黑魔法」,讓大家多多感受一下 Python 的魅力所在,俗話說「藝多不壓身」就是這個道理了。

內存優(yōu)化

首先先讓我們從復習前面的類屬性和實例屬性的知識來引出另一個特殊方法:

>>> class Sample:
...   name = 'rocky'
...

就像前面的文章我們所說的,每個類都有一個 __dict__() 屬性,它包含了當前類的類屬性:

>>> Sample.__dict__
mappingproxy({'__module__': '__main__', 'name': 'rocky', '__dict__': <attribute '__dict__' of 'Sample' objects>, '__weakref__': <attribute '__weakref__' of 'Sample' objects>, '__doc__': None})
>>> Sample.name
'rocky'

同樣,如果我們創(chuàng)建了實例,每個實例也有一個 __dict__ 屬性,它里面就是當前的實例屬性:

>>> a = Sample()
>>> a.__dict__
{}
>>> a.age = 23
>>> a.__dict__
{'age': 23}

上面的操作可以看出,當實例剛剛創(chuàng)建的時候,__dict__ 是空的,只有創(chuàng)建了實例屬性以后,它才包含其內容。實例的 __dict__ 和類的 __dict__ 是有所區(qū)別的,即實例屬性和類屬性是不同的。

從理論上來說,我們可以根據(jù)一個類創(chuàng)建無數(shù)的實例,新建一個實例以后,又創(chuàng)建了一個新的 __dict__,這將是一個很可怕的事情,雖然每個 __dict__ 所占的內存空間很小,當然這件事事實上是不會出現(xiàn)的。但是程序不能建立在這種不可靠的猜測的基礎上,程序要對過程有明確的控制。

所以就要有一種方法能夠控制 __dict__,于是「__slots__」應運而生。

>>> class Nature:
... __slots__ = ('tree','flower')
... 
>>> dir(Nature)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'flower', 'tree']

我們仔細來看 dir() 的結果,發(fā)現(xiàn) __dict__ 屬性沒有了,也就是說 __slots__ 把 __dict__ 擠出去了,它進入了類的屬性。

>>> Nature.__slots__
('tree', 'flower')

從這里可以看出,類 Nature 有且僅有兩個屬性。從類的角度來看,其類屬性只有這兩個;從實例的角度來看,其實例屬性也只有這兩個。

>>> Nature.tree = 'liushu'
>>> Nature.tree
'liushu'
>>> Nature.tree = 'lishu'
>>> Nature.tree
'lishu'

通過類可以對屬性進行賦值和修改,這個似乎和以前的類屬性沒有什么區(qū)別,別著急,繼續(xù)往下看就看到區(qū)別了:

>>> x = Nature()
>>> x.__slots__
('tree', 'flower')
>>> y = Nature()
>>> y.__slots__
('tree', 'flower')
>>> id(x.__slots__)
4531629384
>>> id(y.__slots__)
4531629384

你看,實例化以后,實例的 __slots__ 和類的 __slots__ 完全一樣,這跟前面的 __dict__ 大不一樣了。并且我們建立了兩個實例,結果發(fā)現(xiàn)兩個實例的 __slots__ 在內存中居然是一個,或者可以說是增加實例時 __slots__ 并不增加。

>>> x.tree
'lishu'
>>> y.tree
'lishu'

既然類屬性已經賦值,那么通過任何一個實例屬性都能得到同樣的值,不過這時候不能通過實例修改此屬性的值。

>>> x.tree = 'taoshu'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Nature' object attribute 'tree' is read-only

對實例屬性來說,類的靜態(tài)數(shù)據(jù)是只讀的,不能修改,只有通過類屬性才能修改。但對于尚未賦值的屬性,能夠通過實例賦值。

>>> x.flower = 'rose'
>>> x.flower
'rose'
>>> x.flower = 'moli'

顯然通過實例操作的屬性,也能夠通過實例修改,但是實例屬性的值并不能夠修改類屬性的值

Nature.flower
<member 'flower' of 'Nature' objects>

由上面可以看出,實例屬性的值并沒有傳回給類屬性,也可以理解為新建了一個同名字的實例屬性,如果再給類屬性賦值的話,則會像下面一樣:

>>> Nature.flower = 'huaihua'
>>> x.flower
'huaihua'

類屬性對實例屬性具有決定作用,對實例而言,通過類所定義的屬性都是只讀的。

__slots__ 已經把實例屬性牢牢的看管起來,只能是指定的屬性,如果想要增加屬性的話,只能通過類屬性來實現(xiàn),所以 __slots__ 的一個重要作用就是優(yōu)化了內存。

寫在之后

當然了,__slots__ 還能加快屬性加載速度,這個不是本文的重點,所以不做過多的介紹,感興趣的可以去 Google 一下。

今天的文章就到這里啦,明天講一下「屬性攔截」,又是新的一周,燥起來!

如果你覺得文章對你有幫助的話,歡迎點贊轉發(fā),讓更多的人看到,謝謝啦。

The end。

以上就是詳解python 內存優(yōu)化的詳細內容,更多關于python 內存優(yōu)化的資料請關注腳本之家其它相關文章!

相關文章

  • 解決Python logging模塊無法正常輸出日志的問題

    解決Python logging模塊無法正常輸出日志的問題

    今天小編就為大家分享一篇解決Python logging模塊無法正常輸出日志的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python利用機器學習算法實現(xiàn)垃圾郵件的識別

    Python利用機器學習算法實現(xiàn)垃圾郵件的識別

    今天教大家利用簡單的機器學習算法實現(xiàn)垃圾郵件識別,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python中尾遞歸用法實例詳解

    python中尾遞歸用法實例詳解

    這篇文章主要介紹了python中尾遞歸用法,較為詳細的分析了尾遞歸原理與相關使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Keras自定義實現(xiàn)帶masking的meanpooling層方式

    Keras自定義實現(xiàn)帶masking的meanpooling層方式

    這篇文章主要介紹了Keras自定義實現(xiàn)帶masking的meanpooling層方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 解讀python logging模塊的使用方法

    解讀python logging模塊的使用方法

    logging模塊是Python內置的標準模塊,這篇文章主要介紹了解讀python logging模塊的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python 2種方法求某個范圍內的所有素數(shù)(質數(shù))

    Python 2種方法求某個范圍內的所有素數(shù)(質數(shù))

    這篇文章主要介紹了Python 2種方法求某個范圍內的所有素數(shù)(質數(shù)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • python 檢測nginx服務郵件報警的腳本

    python 檢測nginx服務郵件報警的腳本

    這篇文章主要介紹了python 檢測nginx服務郵件報警的腳本,幫助大家更好的利用python監(jiān)控服務器狀態(tài),感興趣的朋友可以了解下
    2020-12-12
  • 在Docker上部署Python的Flask框架的教程

    在Docker上部署Python的Flask框架的教程

    這篇文章主要介紹了在Docker上部署Python的Flask框架的教程,包括Docker容器內外的網絡通信等,需要的朋友可以參考下
    2015-04-04
  • Python中生成一個指定長度的隨機字符串實現(xiàn)示例

    Python中生成一個指定長度的隨機字符串實現(xiàn)示例

    這篇文章主要介紹了Python中生成一個指定長度的隨機字符串,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 使用Python實現(xiàn)搖號系統(tǒng)的詳細步驟

    使用Python實現(xiàn)搖號系統(tǒng)的詳細步驟

    這篇文章主要介紹了如何使用Python構建一個簡單的搖號系統(tǒng),包括需求分析、技術棧、實現(xiàn)步驟和完整代碼示例,該系統(tǒng)能夠從用戶輸入的參與者名單中隨機抽取指定數(shù)量的中獎者,并將結果展示給用戶以及記錄到日志文件中,需要的朋友可以參考下
    2024-11-11

最新評論

青河县| 长白| 青铜峡市| 新化县| 灌云县| 罗城| 萨嘎县| 东安县| 南和县| 武安市| 芦山县| 建阳市| 博乐市| 兖州市| 土默特左旗| 巴马| 盘锦市| 嘉峪关市| 永济市| 琼海市| 楚雄市| 天津市| 巴林右旗| 原阳县| 襄城县| 巴彦县| 雷州市| 年辖:市辖区| 东乌| 阿荣旗| 斗六市| 阿克苏市| 万盛区| 赤峰市| 罗定市| 南涧| 隆安县| 疏勒县| 明水县| 荣成市| 东海县|