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

Python中的__slots__示例詳解

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

前言

相信Python老鳥都應(yīng)該看過那篇非常有吸引力的Saving 9 GB of RAM with Python's slots 文章,作者使用了__slots__讓內(nèi)存占用從25.5GB降到了16.2GB。在當時來說,這相當于用一個非常簡單的方式就降低了30%的內(nèi)存使用,著實驚人。作者并沒有提到他的業(yè)務(wù)特點和代碼,那我們就基于《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種方法初始內(nèi)存略有差別,但是由于這個差別和總內(nèi)存量相比太小而忽略不計,結(jié)論就是:

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

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

  1. 每個繼承的子類都要重新定義一遍__slots__
  2. 實例只能包含哪些在__slots__定義的屬性,這對寫程序的靈活性有影響,比如你由于某個原因新網(wǎng)給instance設(shè)置一個新的屬性,比如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》比我狠,說的是小于百萬級別實例不值得使用。

總結(jié)

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

相關(guān)文章

  • 解決Jupyter Notebook “signal only works in main thread“問題

    解決Jupyter Notebook “signal only works&nb

    這篇文章主要介紹了解決Jupyter Notebook “signal only works in main thread“問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用Playwright進行視覺回歸測試詳解

    使用Playwright進行視覺回歸測試詳解

    這篇文章主要介紹了使用Playwright進行視覺回歸測試詳解,視覺回歸測試是一種軟件測試技術(shù),專注于檢測Web應(yīng)用程序或網(wǎng)站的用戶界面中的視覺變化和差異,需要的朋友可以參考下
    2023-08-08
  • scrapy框架中用ssh連接遠程服務(wù)器的實現(xiàn)

    scrapy框架中用ssh連接遠程服務(wù)器的實現(xiàn)

    本文主要介紹了scrapy?框架中用ssh連接遠程服務(wù)器的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python連接SQLServer2000的方法詳解

    Python連接SQLServer2000的方法詳解

    這篇文章主要介紹了Python連接SQLServer2000的方法,結(jié)合實例形式分析了Python實現(xiàn)數(shù)據(jù)庫連接過程中所遇到的常見問題與相關(guān)注意事項,需要的朋友可以參考下
    2017-04-04
  • Python實現(xiàn)ssh批量登錄并執(zhí)行命令

    Python實現(xiàn)ssh批量登錄并執(zhí)行命令

    本篇文章主要是介紹了Python實現(xiàn)ssh批量登錄并執(zhí)行命令,有一些任務(wù)可以進行批量完成,Python就可以完成,有需要的同學可以了解一下。
    2016-10-10
  • Python編程使用Selenium模擬淘寶登錄實現(xiàn)過程

    Python編程使用Selenium模擬淘寶登錄實現(xiàn)過程

    這篇文章主要介紹了Python編程使用Selenium模擬淘寶登錄的實現(xiàn)過程示例及解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-10-10
  • Pandas DataFrame replace替換后無效的解決

    Pandas DataFrame replace替換后無效的解決

    這篇文章主要介紹了Pandas DataFrame replace替換后無效的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 如何利用Python matplotlib繪制雷達圖

    如何利用Python matplotlib繪制雷達圖

    這篇文章主要給大家介紹了關(guān)于如何利用Python matplotlib繪制雷達圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • python3實現(xiàn)windows下同名進程監(jiān)控

    python3實現(xiàn)windows下同名進程監(jiān)控

    這篇文章主要為大家詳細介紹了python3實現(xiàn)windows下同名進程監(jiān)控,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python中__del__方法的使用方法詳細解析

    Python中__del__方法的使用方法詳細解析

    __del__()稱為“析構(gòu)方法”,用于實現(xiàn)對象被銷毀時所需的操作,下面這篇文章主要給大家介紹了關(guān)于Python中__del__方法的使用方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02

最新評論

原平市| 平湖市| 资阳市| 伊春市| 保康县| 巴林左旗| 天峨县| 兴安盟| 阜新| 福建省| 德阳市| 绥芬河市| 买车| 垫江县| 喀什市| 锡林郭勒盟| 邻水| 五台县| 广河县| 乌兰浩特市| 广宁县| 宁晋县| 南开区| 东台市| 上虞市| 惠州市| 麻城市| 侯马市| 色达县| 洛川县| 恩施市| 报价| 山丹县| 靖边县| 元谋县| 辉南县| 柏乡县| 三门县| 靖边县| 昌图县| 岚皋县|