python底层设计:整数对象设计

本文深入探讨Python中的整数对象PyIntObject,包括其不可变特性、整数对象池(小整数对象和大整数对象)、内存组织方式、创建与删除的流程。重点介绍了小整数对象池的实现,以及大整数对象如何在内存中轮换使用,以提高性能。
摘要由CSDN通过智能技术生成

目录

 

1.初识整数

2.PyIntObject创建与维护

2.1 对象的创建途径

2.2小整数对象

2.3大整数对象

2.4 添加和删除


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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值