Python中整数对象的实现
2013-03-14 22:17
302 查看
理解Python中的整数对象的实现,有助于我们了解Python的对象系统。在此记下这几天的阅读内容。
PyIntObject是一个结构体,由一个PyObjec_HEAD和int ob_ival组成,如下:
而PyObject_HEAD这个结构体中又有两个字段:int ref引用计数器,struct _typeobject * ob_type表示类型的指针。
Python整数类型分为小整数和大整数,对于频繁使用的小整数,采用引用计数方式,相同的值共享同一块内存,是在python初始化时就分配好了的。
一般为-5~257,可以自己调整。对于这其中的数, 完全缓存。
对于大整数,则是使用PyIntBlock结构,实现单相列表,将内存链接起来,使用的时候,就从free_list里取出一块。
当然,del一个大整数对象的时候,并不是将内存归还给系统,而是加入到自由链表中。
最后,我们来看一看整数对象的创建:
PyIntObject是一个结构体,由一个PyObjec_HEAD和int ob_ival组成,如下:
typedef struct { PyObject_HEAD long ob_ival; } PyIntObject;
而PyObject_HEAD这个结构体中又有两个字段:int ref引用计数器,struct _typeobject * ob_type表示类型的指针。
Python整数类型分为小整数和大整数,对于频繁使用的小整数,采用引用计数方式,相同的值共享同一块内存,是在python初始化时就分配好了的。
一般为-5~257,可以自己调整。对于这其中的数, 完全缓存。
#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]; #endif
对于大整数,则是使用PyIntBlock结构,实现单相列表,将内存链接起来,使用的时候,就从free_list里取出一块。
#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */ #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */ #define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject)) struct _intblock { struct _intblock *next; PyIntObject objects[N_INTOBJECTS]; }; typedef struct _intblock PyIntBlock; static PyIntBlock *block_list = NULL; static PyIntObject *free_list = NULL;
当然,del一个大整数对象的时候,并不是将内存归还给系统,而是加入到自由链表中。
最后,我们来看一看整数对象的创建:
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); #ifdef COUNT_ALLOCS if (ival >= 0) quick_int_allocs++; else quick_neg_int_allocs++; #endif return (PyObject *) v; } #endif if (free_list == NULL) { if ((free_list = fill_free_list()) == NULL) return NULL; } /* Inline PyObject_New */ v = free_list; free_list = (PyIntObject *)Py_TYPE(v); PyObject_INIT(v, &PyInt_Type); v->ob_ival = ival; return (PyObject *) v; }
相关文章推荐
- Python 整数对象实现原理
- 深入 Python 整数对象的实现
- python的整数字符串列表字典对象的实现原理
- ip 与 整数间 的相互转换 python实现
- python通过面向对象程序设计方法 实现铅球运行轨迹的计算
- PAT 1006. 换个格式输出整数 (15);JAVA;Python实现
- Python字典数据对象拆分的简单实现方法
- Python基于二分查找实现求整数平方根的方法
- Python整数对象相关
- Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
- python实现栈和队列--1(面向对象实现)
- 两行Python代码实现IP地址与十进制整数互相转换
- python如何使用生成器函数实现可迭代对象
- 用python简单实现将整数转化为英文字符串
- python源码分析:dict对象的实现
- Python中使用operator模块实现对象的多级排序
- Python源码学习笔记 2 整数对象
- Python中实现通用代理对象
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(Python实现)
- 算法导论程序22--指针和对象的实现(Python)