亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

寫在之前

圍繞類的話題,說是說不完的,僅在特殊方法,除了我們?cè)谇懊嬗龅竭^的 __init__(),__new__(),__str__() 等之外還有很多。雖然它們只是在某些特殊的場景中才會(huì)用到,但是學(xué)會(huì)它們卻可以成為你熟悉這門語言路上的鋪路石。

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

內(nèi)存優(yōu)化

首先先讓我們從復(fù)習(xí)前面的類屬性和實(shí)例屬性的知識(shí)來引出另一個(gè)特殊方法:

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

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

>>> 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)建了實(shí)例,每個(gè)實(shí)例也有一個(gè) __dict__ 屬性,它里面就是當(dāng)前的實(shí)例屬性:

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

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

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

所以就要有一種方法能夠控制 __dict__,于是「__slots__」應(yīng)運(yùn)而生。

>>> 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']

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

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

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

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

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

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

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

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

既然類屬性已經(jīng)賦值,那么通過任何一個(gè)實(shí)例屬性都能得到同樣的值,不過這時(shí)候不能通過實(shí)例修改此屬性的值。

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

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

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

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

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

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

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

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

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

寫在之后

當(dāng)然了,__slots__ 還能加快屬性加載速度,這個(gè)不是本文的重點(diǎn),所以不做過多的介紹,感興趣的可以去 Google 一下。

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

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

The end。

以上就是詳解python 內(nèi)存優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于python 內(nèi)存優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django中使用Celery的方法步驟

    Django中使用Celery的方法步驟

    這篇文章主要介紹了Django中使用Celery,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 在python下讀取并展示raw格式的圖片實(shí)例

    在python下讀取并展示raw格式的圖片實(shí)例

    今天小編就為大家分享一篇在python下讀取并展示raw格式的圖片實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python實(shí)例化對(duì)象的具體方法

    python實(shí)例化對(duì)象的具體方法

    在本篇文章里小編給大家整理的是關(guān)于python實(shí)例化對(duì)象的具體方法,有興趣的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • pygame用blit()實(shí)現(xiàn)動(dòng)畫效果的示例代碼

    pygame用blit()實(shí)現(xiàn)動(dòng)畫效果的示例代碼

    這篇文章主要介紹了pygame用blit()實(shí)現(xiàn)動(dòng)畫效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Cpy和Python的效率對(duì)比

    Cpy和Python的效率對(duì)比

    這篇文章主要介紹了Cpy和Python的效率對(duì)比,本文用一個(gè)循環(huán) 100000000 遍的代碼對(duì)比了Cpy和Python運(yùn)行效率測試,需要的朋友可以參考下
    2015-03-03
  • python實(shí)現(xiàn)中文輸出的兩種方法

    python實(shí)現(xiàn)中文輸出的兩種方法

    這篇文章主要介紹了python實(shí)現(xiàn)中文輸出的兩種方法,實(shí)例分析了Python操作中文輸出的技巧,需要的朋友可以參考下
    2015-05-05
  • django rest framework 自定義返回方式

    django rest framework 自定義返回方式

    這篇文章主要介紹了django rest framework 自定義返回方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 使用 prometheus python 庫編寫自定義指標(biāo)的方法(完整代碼)

    使用 prometheus python 庫編寫自定義指標(biāo)的方法(完整代碼)

    這篇文章主要介紹了使用 prometheus python 庫編寫自定義指標(biāo)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 利用Python制作一個(gè)愚人節(jié)整蠱消息框

    利用Python制作一個(gè)愚人節(jié)整蠱消息框

    又到了一年一度的愚人節(jié)了,本文小編為大家準(zhǔn)備了用Python語言制作的愚人節(jié)整蠱消息框,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • 對(duì)django中render()與render_to_response()的區(qū)別詳解

    對(duì)django中render()與render_to_response()的區(qū)別詳解

    今天小編就為大家分享一篇對(duì)django中render()與render_to_response()的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評(píng)論