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

Python編程通過(guò)懶屬性提升性能

 更新時(shí)間:2021年09月14日 14:36:26   作者:somenzz  
大家好,在我看過(guò)的 Python 教程中,很少討論有懶屬性的,今天分享 Python 的懶屬性技術(shù),可以提升程序的性能,有需要的朋友可以借鑒參考下

懶加載是一種編程范式,它推遲加載操作,直到不得不這樣做。通常,當(dāng)操作開(kāi)銷(xiāo)很大,需要耗費(fèi)大量時(shí)間或空間時(shí),惰性求值是首選實(shí)現(xiàn)。例如,在 Python 中,涉及惰性求值的最著名技術(shù)之一是生成器。生成器不是為迭代創(chuàng)建整個(gè)序列,而是懶惰地一次生成一個(gè)元素。

在 Python 世界之外,許多其他面向?qū)ο蟮木幊陶Z(yǔ)言,例如 Swift 和 Kotlin,都具有與對(duì)象相關(guān)的惰性求值。具體來(lái)說(shuō),你可以指定自定義實(shí)例對(duì)象的特定屬性是惰性的,這意味著在顯式訪問(wèn)這些屬性之前不會(huì)創(chuàng)建這些屬性。

為什么需要懶加載

在我們開(kāi)始討論懶屬性之前,有些人可能想知道為什么它很重要,或者我們?yōu)槭裁匆褂脩袑傩浴?/p>

比如在社交網(wǎng)站中,一個(gè)功能是查看一個(gè)人的關(guān)注者,以列表的形式呈現(xiàn)。當(dāng)我們點(diǎn)擊一個(gè)用戶時(shí),我們可以在彈出窗口中查看該用戶的個(gè)人資料。獲取用戶個(gè)人資料數(shù)據(jù)的操作可能很昂貴,不僅需要訪問(wèn)遠(yuǎn)程服務(wù)器,還需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。

那么在編程實(shí)現(xiàn)時(shí)可以把關(guān)注者的個(gè)人資料作為懶屬性,僅在點(diǎn)擊特定用戶名時(shí)才獲取該屬性。

這就是為什么我們需要懶屬性。

如何使用懶加載

方法 1:

使用 @property

@property 是一個(gè)裝飾器,可以將常規(guī)函數(shù)轉(zhuǎn)化為屬性,比如支持點(diǎn)符號(hào)訪問(wèn)。因此,嚴(yán)格來(lái)說(shuō),創(chuàng)建屬性并不是真正創(chuàng)建懶屬性本身。相反,它只是提供一個(gè)接口來(lái)簡(jiǎn)化數(shù)據(jù)處理的問(wèn)題。讓我們先看看下面的代碼。

class User:
    def __init__(self):
        self._profile_data = None
    @property
    def profile_data(self):
        if self._profile_data is None:
            print("執(zhí)行耗時(shí)操作...")
            self._profile_data = 'profile data'
        return self._profile_data
demo = User()
print("init done")
print(demo.profile_data)
#init done
#執(zhí)行耗時(shí)操作...
#profile data

初始化完成后并不會(huì)執(zhí)行耗時(shí)操作,對(duì)應(yīng)的加載用戶列表就不會(huì)覺(jué)得卡。只有在獲取用戶資料(點(diǎn)擊操作)時(shí),程序會(huì)先判斷是否已經(jīng)存在 _profile_data,沒(méi)有才會(huì)執(zhí)行耗時(shí)操作,如果有直接返回,大大提升了效率。

方法 2:

使用 __getattr__ 特殊方法

在 Python 中,名稱前后有雙下劃線的函數(shù)稱為魔術(shù)方法。__getattr__ 可以幫助我們實(shí)現(xiàn)懶屬性。

對(duì)于自定義類,實(shí)例對(duì)象的屬性保存在字典中,可以訪問(wèn)實(shí)例對(duì)象的 __dict__ 屬性獲取。值得注意的是,如果__dict__ 不包含指定的屬性,Python 將會(huì)調(diào)用魔術(shù)方法 __getattr__,寫(xiě)個(gè)代碼你就明白了:

class User:
    def __init__(self):
        self._profile_data = None
        self.name = 'None'
     def __getattr__(self, item):
        print("called __getattr__")
        if item == 'profile_data':
            if self._profile_data is None:
                print("執(zhí)行耗時(shí)操作...")
                self._profile_data = 'profile data'
            return self._profile_data
 user = User()
print("init done")
print(user.__dict__)
print(user.profile_data)
print(user.__dict__)
print(user.name)

輸出結(jié)果如下:

init done
{'_profile_data': None, 'name': 'None'}
called __getattr__
執(zhí)行耗時(shí)操作...
profile data
{'_profile_data': 'profile data', 'name': 'None'}
None

和方法 1 一樣,初始化完成后并不會(huì)執(zhí)行耗時(shí)操作,我們?cè)讷@取 profile_data 屬性時(shí),由于 profile_data 不在 __dict__ 中,因此會(huì)執(zhí)行 __getattr__ 方法獲取,而 name 在  __dict__ 獲取 name 屬性時(shí)根本就不會(huì)執(zhí)行  __getattr__ 方法。

怎么判斷一個(gè)屬性是不是在 __dict__ 中呢,只要沒(méi)有顯式的定義該屬性,或者使用 setattr 來(lái)設(shè)置屬性,它就不會(huì)在 __dict__  中。

因此可以借助魔術(shù)方法 __getattr__ 來(lái)創(chuàng)建懶屬性 profile_data。

需要注意,Python 還有一個(gè)類似的魔術(shù)方法 __getattribute__,與 __getattr__ 方法不同的是, 每次獲取屬性時(shí)都會(huì)調(diào)用 __getattribute__ 方法。

class User:
    def __init__(self):
        self._profile_data = None
        self.name = 'None'
    def __getattribute__(self, item):
        print("called __getattr__")
user = User()
print("init done")
print(user.profile_data)
print(user.name)

程序輸出如下:

init done
called __getattr__
None
called __getattr__
None

此功能僅在你期望屬性非常頻繁地更改并且只有最新數(shù)據(jù)相關(guān)時(shí)才有用。在這些情況下,我們可以通過(guò)定義相關(guān)函數(shù)來(lái)實(shí)現(xiàn)效果。換句話說(shuō),我不建議你嘗試使用它,因?yàn)楹苋菀紫萑霟o(wú)限遞歸循環(huán)。

最后的話

在本文中,我們重點(diǎn)討論了在 Python 中實(shí)現(xiàn)懶屬性的兩種實(shí)用方法:一種使用 @property 裝飾器,另一種使用 __getattr__ 特殊方法。

就我個(gè)人而言,我更喜歡使用屬性裝飾器,它更直接、更容易理解。但是,當(dāng)你需要定義多個(gè)懶屬性時(shí),該 getattr 方法更好,因?yàn)樗峁┝艘粋€(gè)集中的地方來(lái)管理這些懶屬性。

以上就是Python編程通過(guò)懶屬性提升性能的詳細(xì)內(nèi)容,更多關(guān)于Python懶屬性提升性能的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python mysqldb連接數(shù)據(jù)庫(kù)

    python mysqldb連接數(shù)據(jù)庫(kù)

    今天無(wú)事想弄下python做個(gè)gui開(kāi)發(fā),最近發(fā)布的是python 3k,用到了數(shù)據(jù)庫(kù),通過(guò)搜索發(fā)現(xiàn)有一個(gè)mysqldb這樣的控件,可以使用,就去官方看了下結(jié)果,沒(méi)有2.6以上的版本
    2009-03-03
  • PyQt5中QAbstractScrollArea的詳細(xì)用法教程

    PyQt5中QAbstractScrollArea的詳細(xì)用法教程

    在PyQt5中,QAbstractScrollArea是一個(gè)非常重要的類,它提供了滾動(dòng)區(qū)域的基本框架,允許用戶通過(guò)滾動(dòng)條來(lái)查看超出可視區(qū)域的內(nèi)容,本文將結(jié)合具體案例,詳細(xì)講解QAbstractScrollArea的用法,需要的朋友可以參考下
    2024-08-08
  • python批量將PDF文件轉(zhuǎn)換成圖片的實(shí)現(xiàn)代碼

    python批量將PDF文件轉(zhuǎn)換成圖片的實(shí)現(xiàn)代碼

    這篇文章使用python編寫(xiě)了一個(gè)小腳本,目的是為了實(shí)現(xiàn)批量將PDF文件轉(zhuǎn)換成圖片,文中有詳細(xì)的實(shí)現(xiàn)代碼,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以參考閱讀一下
    2023-08-08
  • web.py獲取上傳文件名的正確方法

    web.py獲取上傳文件名的正確方法

    這篇文章主要介紹了web.py獲取上傳文件名的正確方法,遇到這個(gè)問(wèn)題的朋友可能會(huì)困惑半天,使用本文的正確方法就可以解決這個(gè)問(wèn)題了,需要的朋友可以參考下
    2014-08-08
  • Python實(shí)現(xiàn)文本相似度分析

    Python實(shí)現(xiàn)文本相似度分析

    這篇文章主要旨在通過(guò)設(shè)計(jì)和實(shí)現(xiàn)有關(guān)文本相似度比較的類Vector和Sketch,幫助大家進(jìn)一步掌握設(shè)計(jì)Python類來(lái)解決實(shí)際問(wèn)題的能力,有需要的小伙伴可以學(xué)習(xí)一下
    2023-07-07
  • Python實(shí)現(xiàn)企業(yè)微信機(jī)器人每天定時(shí)發(fā)消息實(shí)例

    Python實(shí)現(xiàn)企業(yè)微信機(jī)器人每天定時(shí)發(fā)消息實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)企業(yè)微信機(jī)器人每天定時(shí)發(fā)消息實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法

    淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法

    這篇文章主要介紹了淺談Python編程中3個(gè)常用的數(shù)據(jù)結(jié)構(gòu)和算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • 在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn)

    在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn)

    這篇文章主要介紹了在VS2017中用C#調(diào)用python腳本的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用python畫(huà)個(gè)小豬佩奇的示例代碼

    使用python畫(huà)個(gè)小豬佩奇的示例代碼

    本文給大家較詳細(xì)的介紹了使用python畫(huà)個(gè)小豬佩奇的示例代碼,感興趣的朋友一起看看吧
    2018-06-06
  • python實(shí)現(xiàn)自動(dòng)登錄12306自動(dòng)搶票功能

    python實(shí)現(xiàn)自動(dòng)登錄12306自動(dòng)搶票功能

    隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來(lái)越多的人選擇通過(guò)網(wǎng)絡(luò)平臺(tái)購(gòu)票,特別是在中國(guó),12306作為官方火車(chē)票預(yù)訂平臺(tái),承擔(dān)了巨大的訪問(wèn)量,對(duì)于熱門(mén)線路或者節(jié)假日出行,往往會(huì)出現(xiàn)一票難求的情況,因此,一些技術(shù)愛(ài)好者嘗試?yán)镁幊陶Z(yǔ)言如Python來(lái)開(kāi)發(fā)搶票腳本
    2025-01-01

最新評(píng)論

南京市| 闵行区| 容城县| 安化县| 金川县| 平武县| 五家渠市| 永城市| 寿光市| 方城县| 丰城市| 缙云县| 太和县| 弋阳县| 西峡县| 四子王旗| 图们市| 奉化市| 昌乐县| 和平区| 萨嘎县| 历史| 九龙县| 靖宇县| 营山县| 杭州市| 安顺市| 宿松县| 昌都县| 霞浦县| 高碑店市| 咸宁市| 鄂托克旗| 鲜城| 闸北区| 丹棱县| 浪卡子县| 屏南县| 桂阳县| 开化县| 广南县|