Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

1.1.2 小整数对象

在实际的编程中,数值比较小的整数,比如2、30等,可能在程序中会被非常频繁地使用。而且编程中for循环的使用频率是非常高的,这也意味着小整数会被频繁地使用。

在Python中,所有的对象都存活在系统堆上。这就是说,如果没有特殊的机制,对于这些频繁使用的小整数对象,Python将一次又一次地使用malloc在堆上申请空间,并且不厌其烦地一次次释放。这样的操作不仅大大降低了运行效率,而且会在系统堆上造成大量的内存碎片,严重影响Python的整体性能。

在Python中,对小整数对象使用了对象池技术。而PyLongObject对象是不可变对象,这意味着对象池里的每一个PyLongObject对象都能够被任意地共享。

在Python中,小整数集合的范围默认设定为[-5,257)。对于小整数对象,Python直接将这些整数对应的PyLongObject对象缓存在内存中,并将其指针存放在small_ints中。

小整数默认的源码位置为Objects/longobject.c。源码如下:


#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif