目录
1.初识整数
python中整数是通过PyIntObject对象实现的,它属于imutable(不可变对象),也就是说在创建一个PyIntObject对象后,就再也不能改变该对象的值了;另外这里的int并非真正的int,而是long 类型,我们看下它的结构源码可以知道:
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
在python程序中,整数使用是非常广泛的,频繁的创建和释放内存是非常影响执行效率的。假如直接使用引用计数机制,执行下面这个循环的话。
>>> for i in range(10000)
这个for循环需要10000次申请和释放内存,这意味着堆需要面临整数对象狂风暴雨的访问,这样的执行效率肯定是无法接受的,那么设计一个高效的机制避免整数对象的使用成为python的瓶颈是至关重要的。Guido给出的解决方案是整数对象池:小整数对象池和通用整数对象池。整数对象池是本章的重点。
在讲解整数对象池之前我们先看看PyIntObject对象的元信息:
PyTypeObject PyInt_Type = {
PyObject_HEAD_INIT(&PyType_Type)
"int",
sizeof(PyIntObject),
(destructor)int_dealloc, /* tp_dealloc */
(printfunc)int_print, /* tp_print */
(cmpfunc)int_compare, /* tp_compare */
(reprfunc)int_repr, /* tp_repr */
&int_as_number, /* tp_as_number */
(hashfunc)int_hash, /* tp_hash */
(reprfunc)int_repr, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
Py_TPFLAGS_BASETYPE, /* tp_flags */
int_doc, /* tp_doc */
int_methods, /* tp_methods */
int_new, /* tp_new */
(freefunc)int_free, /* tp_free */
......
};
从上面可以知道元信息包含了PyIntObject的应该占用的内存大小,对象文档信息,还有PyIntObject支持的操作,部分操作功能如下表:
int_dealloc | 析构操作 |
int_print | 打印操作 |
int_compare | 比较操作 |
int_hash | 获得hash值 |
int_as_number | 数值操作集合 |
int_repr | 转化为PyStringObject对象 |
int_free | 释放操作 |
int_methods | 成员函数集合 |
我先分析下python中compare函数的实现,源码如下:
static