[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,解压后: 对于主要 ...
随机推荐
- 为FreeBSD安装adobe flash插件
参考 FreeBSD官方手册浏览器一章. pkg install nspluginwrapper nspluginwrapper 是一个辅助安装配置 NetScape Plugin的工具. 可以为Ne ...
- 边框画的三角形给shadow
本文地址:http://www.cnblogs.com/veinyin/p/8690882.html 要写一个对话气泡样式,我们首先想到的当然给是一个盒子,然后用边框画一个三角形定位过去. 如果不需 ...
- Struts S2-052漏洞利用之Meterpreter(CVE-2017-9805)
Struts S2-052漏洞爆出来已经快一周了,大家可能更想知道其危害~鸡肋? 这里就直接给出漏洞利用拿Meterpreter的过程,想了解更多的请参考其他文章,下面是实验演示部分.Struts S ...
- webpack详解
webpack是现代前端开发中最火的模块打包工具,只需要通过简单的配置,便可以完成模块的加载和打包.那它是怎么做到通过对一些插件的配置,便可以轻松实现对代码的构建呢? webpack的配置 const ...
- 树形dp(A - Anniversary party HDU - 1520 )
题目链接:https://cn.vjudge.net/contest/277955#problem/A 题目大意:略 具体思路:刚开始接触树形dp,说一下我对这个题的初步理解吧,首先,我们从根节点开始 ...
- 如何清理休眠文件(hiberfil.sys)
如果使用了休眠功能,那么打开系统盘就会有一个很大(5.36G)的hiberfil.sys文件,它是将用户正在运行的程序,保存在这里,再启动系统就很快了.如要清理它(不用休眠功能,或者临时腾出空间),可 ...
- linux shell语言编程规范安全篇之通用原则【转】
shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...
- 【不知道是啥的NOIP模拟赛】网络入侵
题意是这样的: 给你一棵树,每个边有一个初始的0/1边权.你希望把它弄成一个给定的样子. 你每次可以选一条树链取反,然后问你最少要操作几次. ----------------------------- ...
- mysql -> 简介&体系结构_01
数据库简介 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作. 所谓“数据库”系以一定方式储存在一起.能予多个用户共享.具有尽可能小的 ...
- 在Eclipse使用Gradle
1.Gradle安装 1.Grandle官网下载Gradle,地址:http://www.gradle.org/downloads 2.设置环境变量,需要设置如下2个环境变量 2.1添加GRADLE_ ...