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

Python中的__slots__示例詳解

 更新時間:2017年07月06日 11:52:53   作者:Dongweiming  
在python新式類中,可以定義一個變量__slots__,它的作用是阻止在實例化類時為實例分配dict,下面這篇文章主要給大家介紹了關于Python中__slots__的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

相信Python老鳥都應該看過那篇非常有吸引力的Saving 9 GB of RAM with Python's slots 文章,作者使用了__slots__讓內存占用從25.5GB降到了16.2GB。在當時來說,這相當于用一個非常簡單的方式就降低了30%的內存使用,著實驚人。作者并沒有提到他的業(yè)務特點和代碼,那我們就基于《fluent python》中的例子來驗證下是不是有這么厲害:

from __future__ import print_function
import resource
class A(object):
 def __init__(self):
 self.a = 'string'
 self.b = 10
 self.c = True
class B(object):
 __slots__ = ['a', 'b', 'c']
 def __init__(self):
 self.a = 'string'
 self.b = 10
 self.c = True
def test(cls):
 mem_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
 l = []
 for i in range(500000):
 l.append(cls())
 mem_final = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
 del l
 print('Class: {}:\n'.format(getattr(cls, '__name__')))
 print('Initial RAM usage: {:14,}'.format(mem_init))
 print(' Final RAM usage: {:14,}'.format(mem_final))
 print('-' * 20)
if __name__ == '__main__':
 import sys
 test(globals()[sys.argv[1].upper()])

我們分別跑一下這2個類:

❯ python mem_test.py a
Class: A:
Initial RAM usage: 4,890,624
 Final RAM usage: 200,454,144
--------------------
❯ python mem_test.py b
Class: B:
Initial RAM usage: 4,919,296
 Final RAM usage: 60,235,776

2種方法初始內存略有差別,但是由于這個差別和總內存量相比太小而忽略不計,結論就是:

使用slots可以讓內存使用減少3.5倍??!# 通過 (200 - 4) / ((60 - 4) * 1.0) 計算得來

那么用slot就是非非常那個有必要嗎?事實上500000個實例這種機會非常少見,用不用完全根據業(yè)務來決定,并不要以偏概全。因為(敲黑板了哈)使用__slots__也是有副作用的:

  1. 每個繼承的子類都要重新定義一遍__slots__
  2. 實例只能包含哪些在__slots__定義的屬性,這對寫程序的靈活性有影響,比如你由于某個原因新網給instance設置一個新的屬性,比如instance.a = 1, 但是由于a不在__slots__里面就直接報錯了,你得不斷地去修改__slots__或者用其他方法迂回的解決
  3. 實例不能有弱引用(weakref)目標,否則要記得把__weakref__放進__slots__

第三點有點難理解,我寫個例子看看吧:

In [2]: %pycat ref_example.py
from weakref import ref
class A(object):
 __slots__ = ['b']
 def __init__(self):
 self.b = 1
class B(object):
 __slots__ = ['b', '__weakref__']
 def __init__(self):
 self.b = 1
In [3]: from ref_example import *
In [4]: a = A()
In [5]: r = ref(a)
---------------------------------------------------------------------------
TypeError     Traceback (most recent call last)
<ipython-input-6-75a6d689c8b3> in <module>()
----> 1 r = ref(a)
TypeError: cannot create weak reference to 'A' object
In [6]: b = B()
In [7]: r = ref(b)
In [8]: r
Out[8]: <weakref at 0x109199578; to 'B' at 0x10919f890>

所以實例不超過萬級別的類,__slots__是不太值得使用的。

PS: 《fluent python》比我狠,說的是小于百萬級別實例不值得使用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 總結python 三種常見的內存泄漏場景

    總結python 三種常見的內存泄漏場景

    這篇文章主要介紹了總結python 三種常見的內存泄漏場景,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • Django中使用Celery執(zhí)行定時任務問題

    Django中使用Celery執(zhí)行定時任務問題

    這篇文章主要介紹了Django中使用Celery執(zhí)行定時任務問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • jupyter notebook中圖片顯示不出來的解決

    jupyter notebook中圖片顯示不出來的解決

    這篇文章主要介紹了jupyter notebook中圖片顯示不出來的解決操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 初學者學習Python好還是Java好

    初學者學習Python好還是Java好

    在本篇文章里小編給大家分享的是關于初學者學習Python好還是Java好的相關內容,需要的朋友們可以學習下。
    2020-05-05
  • Flask模板繼承深入理解與應用

    Flask模板繼承深入理解與應用

    Flask中的模板可以繼承,通過繼承可以把模板中許多重復出現的元素抽取出來,放在父模板中,并且父模板通過定義block給子模板開一個口,子模板根據需要,再實現這個block
    2022-09-09
  • Python中l(wèi)ambda的用法及其與def的區(qū)別解析

    Python中l(wèi)ambda的用法及其與def的區(qū)別解析

    這篇文章主要介紹了Python中l(wèi)ambda的用法及其與def的區(qū)別解析,需要的朋友可以參考下
    2014-07-07
  • Python沖頂大會 快來答題!

    Python沖頂大會 快來答題!

    直播答題沖頂大會,你玩了嗎?本文為大家分享了10道Python測試題,你答對1道算我輸
    2018-01-01
  • python如何判斷IP地址合法性

    python如何判斷IP地址合法性

    這篇文章主要為大家詳細介紹了python如何判斷IP地址合法性,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Python實現發(fā)送帶有pdf附件的電子郵件

    Python實現發(fā)送帶有pdf附件的電子郵件

    使用Python發(fā)郵件,是個簡單的話題,可是如何可以優(yōu)雅的輕松的群發(fā)郵件,并附加PDF附件,是很多小伙伴的日常工作。本文就來和大家分享一下實現方法,需要的可以參考一下
    2023-02-02
  • 利用Tensorflow的隊列多線程讀取數據方式

    利用Tensorflow的隊列多線程讀取數據方式

    今天小編就為大家分享一篇利用Tensorflow的隊列多線程讀取數據方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論