目录
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中的整数对象PyIntObject,包括其不可变特性、整数对象池(小整数对象和大整数对象)、内存组织方式、创建与删除的流程。重点介绍了小整数对象池的实现,以及大整数对象如何在内存中轮换使用,以提高性能。

322

被折叠的 条评论
为什么被折叠?



