天天看點

整數對象池

Python 的内建對象存放在源代碼的

Objects

目錄下。

intobject.c

用于整數對象

在 Python 中,整數分為

小整數對象

大整數對象

小整數對象

由于數值較小的整數對象在記憶體中會很頻繁地使用,如果每次都向記憶體申請空間、請求釋放,會嚴重影響 Python 的性能。好在 整數對象 屬于不可變對象,可以被共享而不會被修改導緻問題,是以為 小整數對象 劃定一個範圍,即小整數對象池,在Python運作時初始化并建立範圍内的所有整數,這個範圍内的 整數對象是被共享的,即一次建立,多次共享引用。

那麼這個範圍是多少呢?從源檔案中可以看到,而且,使用者可以自行調整,隻是每次都要在源檔案中修改,而後進行編譯、安裝。

小整數池的範圍:

#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
/* References to small integers are saved in this array so that they
   can be shared.
   The integers that are saved are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];           

從源代碼可以看出

define NSMALLPOSINTS 257

,範圍的右邊界

define NSMALLNEGINTS 5

,範圍的左邊界

-NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive)

,[-5, 257)

https://github.com/python/cpython/blob/2.7/Objects/intobject.c#L67-L80