99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
2023-11-21 閱讀量: 5026
CDA學(xué)習(xí) python的駐留機(jī)制

如今有幾種不同的 Python 解釋器,包括 CPython、Jython、IronPython 等。我們現(xiàn)在討論的優(yōu)化技術(shù)是跟 CPython 這種標(biāo)準(zhǔn)的 Python 解釋器有關(guān)的。

駐留機(jī)制

Interning(駐留機(jī)制)是指根據(jù)需要重用對(duì)象 ,而不是創(chuàng)建新對(duì)象。我們通過(guò)一些例子來(lái)理解 Integer 類型對(duì)象和 String 類型對(duì)象的駐留機(jī)制。

is - is 是一種運(yùn)算符,用于比較兩個(gè) Python 對(duì)象的內(nèi)存位置。

id - id 用于獲取對(duì)象的十進(jìn)制形式的內(nèi)存位置。

Integer 對(duì)象的駐留

Python 啟動(dòng)之時(shí)在內(nèi)存中預(yù)加載了一系列 Integer 對(duì)象,這些對(duì)象是從 -5 到 256 之間的數(shù)字。我們無(wú)論何時(shí)創(chuàng)建的該范圍內(nèi)的 Integer 對(duì)象都會(huì)自動(dòng)指向這些預(yù)先加載的內(nèi)存位置,Python 不會(huì)因此創(chuàng)建新的對(duì)象。

使用這樣的優(yōu)化策略的原因很簡(jiǎn)單,是由于 -5 到 256 范圍內(nèi)的數(shù)字經(jīng)常會(huì)用到。把它們預(yù)存在內(nèi)存中是有實(shí)際意義的。所以,Python 在啟動(dòng)之時(shí)把它們預(yù)加載到內(nèi)存里面使得運(yùn)行速度和內(nèi)存得到優(yōu)化。

例 1

本例中,變量 a 和變量 b 都被賦值 100。由于 100 是 -5 到 256 范圍內(nèi)的數(shù)值,Python 會(huì)使用駐留的對(duì)象,變量 b 也會(huì)指向同一內(nèi)存位置,而不會(huì)創(chuàng)建另一個(gè)值為 100 的對(duì)象。

Image by Author

從下面的代碼可以看出,變量 a 和變量 b 指向的是內(nèi)存中同一對(duì)象。Python 不會(huì)為變量 b 創(chuàng)建新的對(duì)象,而是指向了變量 a 的內(nèi)存位置。這是由于 Integer 對(duì)象的駐留機(jī)制決定的。

Image by Author

例 2

本例中,變量 a 和變量 b 都被賦值 1000。由于 1000 不在 -5 到 256 范圍內(nèi),Python 會(huì)創(chuàng)建兩個(gè) Integer 對(duì)象。所以變量 a 和變量 b 的存儲(chǔ)位置就不一樣了。

Image by Author

從下面的代碼可以看出,變量 a 和變量 b 在內(nèi)存中的存儲(chǔ)位置是不同的。

Image by Author

String 對(duì)象的駐留

跟 Integer 對(duì)象一樣,某些 String 對(duì)象也是駐留的。一般來(lái)說(shuō),任何符合標(biāo)識(shí)符命名規(guī)范的 String 對(duì)象都是駐留的。有時(shí)也存在例外,所以不要完全依賴于駐留機(jī)制。

例 1

字符串 “Data” 是合法的標(biāo)識(shí)符,它會(huì)駐留,所以兩個(gè)變量都指向同一內(nèi)存位置。

Image by Author

例 2

字符串 “Data Science” 不是合法的標(biāo)識(shí)符,駐留機(jī)制無(wú)效,所以兩個(gè)變量指向不同的內(nèi)存位置。

Image by Author

上述例子都來(lái)自 Google Colab,使用的 Python 版本是 3.6.9。

在 Python 3.6 中,所有合法的、長(zhǎng)度不大于 20 的字符串都是駐留的。但在 Python 3.7 中,長(zhǎng)度上限變?yōu)?4096。所以正如我以前提到的,這些標(biāo)準(zhǔn)因 Python 版本而異。

由于不是所有的 String 對(duì)象都被駐留,Python 提供了強(qiáng)制駐留字符串的方法 sys.intern()。這個(gè)方法除非確實(shí)需要,否則不建議使用。使用方法參考下面的代碼。

Image by Author

String 對(duì)象駐留的重要意義

假定在你的應(yīng)用程序中,會(huì)頻繁進(jìn)行字符串操作。如果使用 == 運(yùn)算符來(lái)比較長(zhǎng)度較大的字符串,Python 會(huì)一個(gè)個(gè)字符去比較,這顯然是費(fèi)時(shí)的。但如果這些長(zhǎng)字符串被駐留,它們就指向了相同的內(nèi)存位置。由于比較內(nèi)存位置的操作會(huì)快得多,我們就可以使用 is 運(yùn)算符來(lái)進(jìn)行字符串比較。



0.0000
0
關(guān)注作者
收藏
評(píng)論(0)

發(fā)表評(píng)論

暫無(wú)數(shù)據(jù)
推薦帖子