Python 對象緩沖池機制

python 中一切皆是對象,對象有三要素: Id,Type,Value

Id:唯一標識一個對象

Type:標識對象的類型

Value:對象的值

a is b 判斷 a 對象是否就是 b 對象(通過id來判斷)

a == b 判斷 a 對象的值是否和 b 對象的值相等(通過value來判斷)

我們都知道

x = 1

y = 1?

x == y ###True

x is y ####True

但是為什么

x = 123456

y = 123456

x == y ### True

x is y ### False

通過用id函數(shù)查看對象在系統(tǒng)中的內(nèi)存地址我們可以發(fā)現(xiàn)


當(dāng)為變量賦值大小不同的值時,值相同的不同變量,當(dāng)值很大時,變量內(nèi)存地址不相同,Why?

Python是如何分配內(nèi)存空間的

類型值的內(nèi)置數(shù)據(jù)類型,數(shù)值型,字符串,列表,字典等都會有自己的對象緩存池,

這樣做的好處是,避免了頻繁的申請內(nèi)存,釋放內(nèi)存,這樣會極大的降低應(yīng)用程序的運行速度,還會造成大量的內(nèi)存碎片。因此提供對象緩存機制是非常重要的。

以int 整型為例介紹python 對象緩存池

python 定義的數(shù)值緩存范圍是 -5 ~ 257

源碼定義如下:

class int "PyObject *" "&PyLong_Type"

[clinic start generated code]*/

/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/

#ifndef NSMALLPOSINTS

#define NSMALLPOSINTS? ? ? ? ? 257

#endif

#ifndef NSMALLNEGINTS

#define NSMALLNEGINTS? ? ? ? ? 5

#endif

_Py_IDENTIFIER(little);

_Py_IDENTIFIER(big);

/* convert a PyLong of size 1, 0 or -1 to an sdigit */

#define MEDIUM_VALUE(x) (assert(-1 <= Py_SIZE(x) && Py_SIZE(x) <= 1),? \

? ? ? ? Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] :? \

? ? ? ? ? ? (Py_SIZE(x) == 0 ? (sdigit)0 :? ? ? ? ? ? ? ? ? ? ? ? ? ? \

? ? ? ? ? ? ? (sdigit)(x)->ob_digit[0]))

對于-5 ~ 257 范圍內(nèi)的數(shù)值, 創(chuàng)建后python 會將其加入緩存池當(dāng)中,當(dāng)再次使用時,則直接從緩存池中返回,而不需要申請內(nèi)存,如果超出了這個范圍的數(shù)值,則每次都需要申請內(nèi)存。

當(dāng)數(shù)值在 -5 ~ 257 范圍內(nèi),內(nèi)存地址都一樣

但是超出了該范圍時,python 對于每個數(shù)值都需要申請內(nèi)存,因此內(nèi)存地址會不一樣

版權(quán)聲明:本文為CSDN博主「lucky404」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/lucky404/article/details/79677248

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容