作者: MATSUI Fe2+ Tetsushi
日時: 2008/5/25(12:25)
Fe2+ です。

ソースを見るという発想はありませんでした。

今回の短整数の話だと、intobject.c ですね。

typedef struct {
    PyObject_HEAD
    long ob_ival;
} PyIntObject;

ということで、object に ob_ival を追加したようなものになっています。
小さい値は使い回す、という部分は

PyObject *
PyInt_FromLong(long ival)
{
	register PyIntObject *v;
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
	if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
		v = small_ints[ival + NSMALLNEGINTS];
		Py_INCREF(v);
		return (PyObject *) v;
	}
#endif

で、small_ints に入っているのを使って、参照カウントだけ増やしています。
他の数でも実は

/* Integers are quite normal objects, to make object handling uniform.
   (Using odd pointers to represent integers would save much space
   but require extra checks for this special case throughout the code.)
   Since a typical Python program spends much of its time allocating
   and deallocating integers, these operations should be very fast.
   Therefore we use a dedicated allocation scheme with a much lower
   overhead (in space and time) than straight malloc(): a simple
   dedicated free list, filled when necessary with memory from malloc().

(整数はとってもありふれたオブジェクトなので、オブジェクトの取扱は統一
しておきたい。(特別なポインタを使って整数を表わしておけば領域を大幅に
節約できるけど、コード全体に亘ってこの特殊ケースのチェックが必要になっ
てしまう。)典型的な Python プログラムでは整数の割り当てと破棄にほとん
どの時間を費やすので速くないと困る。だから通常の malloc() より(領域的
にも時間的にも)ずっとオーバーヘッドの少ない専用の割り当て方法を使う:
専用のフリーリストで、必要なときに malloc() されたメモリーで埋められる
もの。)

なんてことをしていたようです(訳はかなり適当です)。普通のオブジェクトよ
りは工夫されているんですね。初めて知りました。

たまにはソースも覗いてみるもんですね。
-- 
MATSUI "Fe2+" Tetsushi