激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python編程通過懶屬性提升性能

Python編程通過懶屬性提升性能

2022-01-06 00:13somenzz Python

大家好,在我看過的 Python 教程中,很少討論有懶屬性的,今天分享 Python 的懶屬性技術,可以提升程序的性能,有需要的朋友可以借鑒參考下

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

在 Python 世界之外,許多其他面向對象的編程語言,例如 Swift 和 Kotlin,都具有與對象相關的惰性求值。具體來說,你可以指定自定義實例對象的特定屬性是惰性的,這意味著在顯式訪問這些屬性之前不會創建這些屬性。

為什么需要懶加載

在我們開始討論懶屬性之前,有些人可能想知道為什么它很重要,或者我們為什么要使用懶屬性。

比如在社交網站中,一個功能是查看一個人的關注者,以列表的形式呈現。當我們點擊一個用戶時,我們可以在彈出窗口中查看該用戶的個人資料。獲取用戶個人資料數據的操作可能很昂貴,不僅需要訪問遠程服務器,還需要將數據存儲在內存中。

那么在編程實現時可以把關注者的個人資料作為懶屬性,僅在點擊特定用戶名時才獲取該屬性。

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

如何使用懶加載

方法 1:

使用 @property

@property 是一個裝飾器,可以將常規函數轉化為屬性,比如支持點符號訪問。因此,嚴格來說,創建屬性并不是真正創建懶屬性本身。相反,它只是提供一個接口來簡化數據處理的問題。讓我們先看看下面的代碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class User:
    def __init__(self):
        self._profile_data = None
    @property
    def profile_data(self):
        if self._profile_data is None:
            print("執行耗時操作...")
            self._profile_data = 'profile data'
        return self._profile_data
demo = User()
print("init done")
print(demo.profile_data)
#init done
#執行耗時操作...
#profile data

初始化完成后并不會執行耗時操作,對應的加載用戶列表就不會覺得卡。只有在獲取用戶資料(點擊操作)時,程序會先判斷是否已經存在 _profile_data,沒有才會執行耗時操作,如果有直接返回,大大提升了效率。

方法 2:

使用 __getattr__ 特殊方法

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

對于自定義類,實例對象的屬性保存在字典中,可以訪問實例對象的 __dict__ 屬性獲取。值得注意的是,如果__dict__ 不包含指定的屬性,Python 將會調用魔術方法 __getattr__,寫個代碼你就明白了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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("執行耗時操作...")
                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)

輸出結果如下:

?
1
2
3
4
5
6
7
init done
{'_profile_data': None, 'name': 'None'}
called __getattr__
執行耗時操作...
profile data
{'_profile_data': 'profile data', 'name': 'None'}
None

和方法 1 一樣,初始化完成后并不會執行耗時操作,我們在獲取 profile_data 屬性時,由于 profile_data 不在 __dict__ 中,因此會執行 __getattr__ 方法獲取,而 name 在  __dict__ 獲取 name 屬性時根本就不會執行  __getattr__ 方法。

怎么判斷一個屬性是不是在 __dict__ 中呢,只要沒有顯式的定義該屬性,或者使用 setattr 來設置屬性,它就不會在 __dict__  中。

因此可以借助魔術方法 __getattr__ 來創建懶屬性 profile_data。

需要注意,Python 還有一個類似的魔術方法 __getattribute__,與 __getattr__ 方法不同的是, 每次獲取屬性時都會調用 __getattribute__ 方法。

?
1
2
3
4
5
6
7
8
9
10
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

此功能僅在你期望屬性非常頻繁地更改并且只有最新數據相關時才有用。在這些情況下,我們可以通過定義相關函數來實現效果。換句話說,我不建議你嘗試使用它,因為很容易陷入無限遞歸循環。

最后的話

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

就我個人而言,我更喜歡使用屬性裝飾器,它更直接、更容易理解。但是,當你需要定義多個懶屬性時,該 getattr 方法更好,因為它提供了一個集中的地方來管理這些懶屬性。

以上就是Python編程通過懶屬性提升性能的詳細內容,更多關于Python懶屬性提升性能的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/somenzz/article/details/118213450

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧洲a级片 | 永久免费在线观看av | 中文字幕 亚洲一区 | 免费观看黄色影片 | 国产91av视频 | 久久中文免费 | 成人国产在线视频 | 欧美a黄 | 色就色 综合偷拍区91网 | 久久久精品精品 | 欧美a级毛片 | 精品国产一区二区三区四 | 成人午夜在线播放 | 国产高潮国产高潮久久久91 | 国产午夜精品久久久久久久蜜臀 | 中文字幕在线观看成人 | 黄色美女网站免费看 | 国产精品夜色视频一级区 | 欧美18—19sex性hd | 一级免费在线 | 国产精品福利一区 | 久久精品一二三区 | 欧美又黄又嫩大片a级 | 久久亚洲精品国产一区 | 热99视频| 亚洲小视频在线播放 | 国产一区二区三区在线视频 | 娇妻被各种姿势c到高潮小说 | 中文字幕欧美专区 | 亚洲最新无码中文字幕久久 | 欧美黑大粗硬毛片视频 | 欧美亚洲啪啪 | 亚洲91精品| 成人午夜看片 | videos真实高潮xxxx | 久草在线高清视频 | 欧美一级爱操视频 | 永久免费黄色片 | 亚洲欧美日韩久久精品第一区 | 男男啪羞羞视频网站 | 欧美精品黄色 |