python 物件緩衝池
阿新 • • 發佈:2019-01-07
python 的內建資料型別,數值型,字串,列表,字典等都會有自己的物件快取池,
這樣做的好處是,避免了頻繁的申請記憶體,釋放記憶體,這樣會極大的降低應用程式的執行速度,還會造成大量的記憶體碎片。因此提供物件快取機制是非常重要的。
以int 型別為例介紹python 物件快取池
python 定義的數值快取範圍是 -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 範圍內的數值, 建立後python 會將其加入快取池當中,當再次使用時,則直接從快取池中返回,而不需要申請記憶體,如果超出了這個範圍的數值,則每次都需要申請記憶體。
從下面的例子就能看出來,他們的記憶體地址,當數值在 -5 ~ 257 範圍內,記憶體地址都一樣
但是超出了該範圍時,python 對於每個數值都需要申請記憶體,因此記憶體地址會不一樣