[python 源码]整数对象的创建和维护
刚开始学python时候,发现一个很迷惑的现象,一直到看了源码后才知道了:
>>> a=6
>>> b=6
>>> a is b
True
想用同样的参数初始化两个对象,结果却是,这两个对象其实是同样的对象????逗我呢?
>>> a=666
>>> b=666
>>> a is b
False
这又是怎么回事?为什么现在又是False了???
这些不同,主要来自于python中对待小整数和大整数的初始化方式不同,而且他们都是在对象池中的,只不过所在的对象池不同。。。
那么,什么是小整数,什么又是大整数?在python中默认-5~256为小整数,其余的为大整数。。。
>>> a=256
>>> b=256
>>> a is b
True
>>> a=257
>>> b=257
>>> a is b
False
那么问题又来了,为什么要区分小整数和大整数?
因为如果不停的调用malloc和free,会严重的影响python的性能,为了减少malloc和free的次数,python会预先初始化所有小整数的对象,也就是说,在我们用小整数对象的时候,没有创建,没有初始化,而是得到了一个本来就在内存中的小整数对象的引用
如果小整数太多的话,会占用太多的内存,也会影响性能的,所以Guido大叔就默认了-5~256为小整数。
那么,大整数是怎么初始化的?
为了减少创建大整数对象时候减少malloc和free的次数,当用到大整数时候,python会一次malloc几十个大整数对象的链表,称为一个block,一个block占用1k空间,大概可以存放40个整数对象,然后用一个block_list指针指向所有分配的整数对象的链表,当这个block用完的时候,再malloc从下一个block。
那么,问题又来了,比如,如果第二个block中的内存还没用完,第一个block中已经有对象不用了怎么办?岂不是就浪费了
在python中,会有一个free_list的指针指向所有可用的对象内存,当某个对象不用的时候,就添加到free_list链表中。
发现了什么,竟然只有malloc,没有free,没有内存交换系统。
python中应该还有另外一个机制防止内存泄露。。。这个现在就还不明白怎么做到的了
参考资料:python源码剖析
[python 源码]整数对象的创建和维护的更多相关文章
- [python 源码]字符串对象的实现
还是带着问题上路吧,和整数对象的实现同样的问题: >>> a='abc' >>> b='abc' >>> a is b True >> ...
- JQuery源码解析-- 对象的创建
使用 $("a") 返回的对象就不再是一个简单的DOM对象了,而是一个复杂的JQuery对象. 那么JQuery是怎么创建对象的. 为了便于分析,我将JQuery中复杂的代码简化了 ...
- Python 源码剖析(二)【整数对象】
二.整数对象 1.PyIntObject 2.PyIntObject 对象的创建和维护 3.Hack PyIntObject 1.PyIntObject PyIntObject的定义: [intobj ...
- [python]源码-对象的创建和行为
(明天论文就要送审了!!!距离毕业一个月!!!) 现在还记得刚开始学python时候被这种动态语言惊到的那种感觉,列表和字典对象可以随意伸缩,简直不能更帅了,但是一直不知道内部到底是怎么实现的,pyt ...
- Python源码剖析——01内建对象
<Python源码剖析>笔记 第一章:对象初识 对象是Python中的核心概念,面向对象中的"类"和"对象"在Python中的概念都为对象,具体分为 ...
- Python源码分析(二) - List对象
python中的高级特性之一就是内置了list,dict等.今天就先围绕列表(List)进行源码分析. Python中的List对象(PyListObject) Python中的的PyListObje ...
- Python 源码剖析(一)【python对象】
处于研究python内存释放问题,在阅读部分python源码,顺便记录下所得.(基于<python源码剖析>(v2.4.1)与 python源码(v2.7.6)) 先列下总结: ...
- [Python源码剖析]获取Python小整数集合范围
#!/usr/bin/env python #-*- coding=utf-8 -*- small_ints = dict() for i in range(-10000,10000): small_ ...
- Python源码分析(一)
最近想学习下Python的源码,希望写个系列博客,记录的同时督促自己学习. Python源码目录 从Python.org中下载源代码压缩包并解压,我下载的是Python2.7.12,解压后: 对于主要 ...
随机推荐
- Token报错问题
解决token报错,CSRF令牌问题: <form method="POST" action=""> {{ csrf_field() }} < ...
- Python练习-sys.argv的无聊用法
代码如下: # 编辑者:闫龙 #将三次登陆锁定的作业改为: # python login.py -u alex -p 123456 输入的形式 # (-u,-p是固定的,分别代表用户名和密码) imp ...
- 突破XSS字符限制执行任意JS代码
突破XSS字符限制执行任意JS代码 一.综述 有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不 ...
- Servlet笔记6--Servlet程序改进
第一步改进,GenericServlet: 我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写serv ...
- ubuntu16.04 eclipse+pydev 配置
参考:http://blog.csdn.net/bluish_white/article/details/56509446,http://blog.csdn.net/qing101hua/articl ...
- JDOM生成XML文档的一般方法
由于DOM提供的生成XML的方法不够直观,而且要用到各种繁琐的注解,鉴于此可借助第三方库-----JDOM生成XML文档.具体操作方式如下: import java.io.FileOutputStre ...
- linux shell语言编程规范安全篇之通用原则【转】
shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...
- jdbc一次性采集mysql和oracle的海量数据,5000W+为例
最近做的采集工具遇到采集一天数据(超过5000W行数据)的情况, 采集mysql的时候直接采用流式读取的方式可以一次全部都读取出来,速度的话取决于网络速度 stmt = conn.createStat ...
- java基础20 StringBuffer缓冲类
1.概要 StringBuffer 其实就是一个存储字符的容器 字符串特点:字符串是常量;它们创建之后不能更改了字符串一旦发生变化,那么立马创建一个新的对象.注意:字符串的内容不适合频繁修改的,因为一 ...
- 漂亮的SVG时钟
漂亮的SVG时钟 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html lang="en"> <head> <m ...