Python類的動態(tài)綁定實(shí)現(xiàn)原理
使用實(shí)例引用類的屬性時,會發(fā)生動態(tài)綁定。即python會在實(shí)例每次引用類屬性時,將對應(yīng)的類屬性綁定到實(shí)例上。
動態(tài)綁定的例子:
class A:
def test1(self):
print("hello")
def test2(self):
print("world")
def bound():
a = A()
a.test1()
A.test1 = A.test2
a.test1()
if __name__ == "__main__":
bound()
輸出結(jié)果:
hello2 world
從上述代碼中可以看到,類方法的變化是實(shí)時影響實(shí)例對方法的調(diào)用的,這說明python是在實(shí)例調(diào)用方法的過程中動態(tài)地查找類方法。
動態(tài)綁定的代價:
class A:
def test(self):
pass
def one_loop(limited_time):
a = A()
for i in range(limited_time):
a.test()
f = a.test
for i in range(limited_time):
f()
上圖兩個循環(huán)中,一個調(diào)用a.test(),不斷進(jìn)行動態(tài)綁定,另一個則先把a(bǔ).test賦值給f,只有一次動態(tài)綁定,通過對兩個循環(huán)計時,測試動態(tài)綁定的代價。
輸出結(jié)果:

1 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0009999275207519531, 0.008995771408081055, 0.19991111755371094, 1.2715933322906494, 15.831915855407715]
2 [0.0, 0.0, 0.0, 0.0, 0.0, 0.12503726671039295, 0.09472344399590288, 0.1999776288967874, 0.131608969147562, 0.1553209370384522]
折線圖中橫坐標(biāo)為log10(循環(huán)次數(shù)),縱坐標(biāo)為秒數(shù)。
輸出數(shù)據(jù)中,第一行為動態(tài)綁定和一次綁定耗費(fèi)時間的差值,第二行為差值占動態(tài)綁定總時間的比例。
可以看出,在次數(shù)很小的時候,兩者基本沒有差距,或者說差距忽略不計。
在10^7次循環(huán),即千萬次循環(huán)的時候,動態(tài)綁定與靜態(tài)綁定的耗費(fèi)時間才出現(xiàn)了明顯差異,當(dāng)循環(huán)次數(shù)達(dá)到十億級的時候,耗費(fèi)時間相差15秒之多,約占總時間的15%。
由上可知,動態(tài)綁定效率低于靜態(tài)綁定,但由于綁定代價耗時很少,在次數(shù)很少的時候基本沒有影響。
動態(tài)綁定的優(yōu)點(diǎn):
class A:
def test_hello(self):
print("hello")
def test_world(self):
print("world")
def main():
s = A()
# 提前綁定
f = s.test_hello
# 改變方法
A.test_hello = test_world
f()
# 動態(tài)綁定
s.test_hello()
if __name__ == "__main__":
main()
輸出結(jié)果:
hello2 world
類方法的變動能夠?qū)崟r反應(yīng)在動態(tài)綁定上,而提前綁定則無法感知到類方法的變動。
總結(jié):
1. 一次動態(tài)綁定代價很小,當(dāng)綁定次數(shù)少的時候基本不影響效率,當(dāng)綁定次數(shù)達(dá)到千萬級時影響才會很顯著。
2. 動態(tài)綁定實(shí)時跟蹤類方法的變動,更具靈活性。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)跨域代理服務(wù)器的方法
這篇文章主要介紹了python實(shí)現(xiàn)跨域代理服務(wù)器的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實(shí)例解析
這篇文章主要介紹了python數(shù)據(jù)類型判斷type與isinstance的區(qū)別實(shí)例解析,具有一定參考價值,需要的朋友可以了解下。2017-10-10
Python函數(shù)關(guān)鍵字參數(shù)及用法詳解
本文主要介紹了Python函數(shù)關(guān)鍵字參數(shù)及用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python 使用PIL中的resize進(jìn)行縮放的實(shí)例講解
今天小編就為大家分享一篇Python 使用PIL中的resize進(jìn)行縮放的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Python?中的裝飾器實(shí)現(xiàn)函數(shù)的緩存(場景分析)
Python中的裝飾器可以用于實(shí)現(xiàn)函數(shù)的緩存,其原理是在函數(shù)執(zhí)行前,首先判斷傳入的參數(shù)是否在緩存中已經(jīng)存在對應(yīng)的計算結(jié)果,這篇文章主要介紹了Python?中的裝飾器可以用于實(shí)現(xiàn)函數(shù)的緩存,需要的朋友可以參考下2023-02-02
Python HTMLParser模塊解析html獲取url實(shí)例
這篇文章主要介紹了Python HTMLParser模塊解析html獲取url實(shí)例,HTMLParser是python用來解析html的模塊,HTMLParser采用的是一種事件驅(qū)動的模式,需要的朋友可以參考下2015-04-04
基于Flask實(shí)現(xiàn)文件上傳七牛云中并下載
文件上傳是Web應(yīng)用中常見的功能之一,而七牛云則提供了強(qiáng)大的云存儲服務(wù),本文我們將學(xué)習(xí)如何在Flask應(yīng)用中實(shí)現(xiàn)文件上傳,并將上傳的文件保存到七牛云,感興趣的可以學(xué)習(xí)一下2023-10-10
關(guān)于torch.scatter與torch_scatter庫的使用整理
這篇文章主要介紹了關(guān)于torch.scatter與torch_scatter庫的使用整理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
python 實(shí)現(xiàn)將多條曲線畫在一幅圖上的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)將多條曲線畫在一幅圖上的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

