1. PyStringObject对象

    typedef struct {PyObject_VAR_HEADlong ob_shash;int ob_sstate;char ob_sval[1];
    } PyStringObject;
    

    头部保存一个ob_size,表示字符串在内存中的具体长度,字符串由ob_sval指针指向,但是,字符串的最后一位也一定是’\0’结束,由于有ob_size的标记,允许字符串中间也有’\0’字符的存在。

  2. 字符串的类型对象中,tp_itemsize设置为sizeof(char),这个值表示变长对象中每个元素单位的长度,每一个python中的变长对象(string、list等),都需要在对应的类型对象中设置tp_itemsize的值。tp_itemsize和ob_size共同决定了一个对象需要在内存中实际占用的空间大小。

  3. 对于空字符串,python会返回其内部的nullstring对象,避免每次都创建,这个对象相当于是共享的。

  4. Intern机制。为了避免每次为相同的字符串开创新对象,可以利用Intern机制来实现。相当于创建时会先查找是否有使用了Intern机制创建的对象,包含的字符串和待创建的一样,如果存在,则直接返回该对象的引用,而不用再次创建一个全新的对象。

  5. interned的实现,实际上是维护了一个map<PyObject*, PyObject*>的字典集合,key,value都是那个采用Interned机制的Py对象指针,如果在这个map中找到一个对象的字符串内容和待创建的一致,则直接把待创建的指针指向这个map的value。加入Map时,按照py的引用计数规则,对应的对象引用计数会先+1,相当于这个对象引用+2了,这样的话,这种对象实际不可能出现引用为0的情况,所有,对于加入到Interned中的对象,会在加入完毕后执行引用计数-2的操作。

  6. 对于单个字符的,也有一个静态缓冲区,类似PyIntObject对小整数的处理。

  7. PyListObject类似于c++中的vector

  8. 结构定义:

        typedef struct {PyObject_VAR_HEADPyObject **ob_item;int allocated;} PyListObject;
    

    一次分配的内存是大于现实需要的内存,类似vector的内存分配策略。
    0 <= ob_size <= allocated;
    len(list) == ob_size

  9. append的元素会放在ob_size位置上,所以内部元素的内存空间不一定连续,但是逻辑上是连续的

  10. PyList的对象缓冲池。 在每个PyList被销毁的那会,会检测free_list这个缓冲池是否满了,如果没满,则会把当前这个待销毁的对象放入这个缓冲池中。当然,这个List内部的元素item都是要被free掉内存的,不然就是一堆野指针了。只是这个对象的内存空间会被缓存下来,避免下次的再次申请内存导致额外的消耗。

  11. PyDictObject底层采用hash_table来存储,hash冲突利用开放地址法来解决(lookdict方法来搜索元素)。

  12. dict里面每个pair对都是一个PyDictEntry

        typedef struct {long me_hash; /* cached hash code of me_key */PyObject *me_key;PyObject *me_value;} PyDictEntry;
    

    每个dict内部都有一个PyDictEntry的小规模数组(默认8),当dict的size小于8时,内部标识的ma_table指针就指向这个小数组,如果大于8,则申请一块大内存,ma_table指向那块内存。me_key有三种状态,dummy、unused和实际有效使用的active。删除元素后会变成dummy状态,freeslot指针会指向该位置,freeslot在下次插入新元素时会使用到。

  13. 搜索时根据hash值查找,如果查到的key和待搜索的不同,则根据lookdict二次探测。

  14. dict每次的插入,会调用PyDict_SetItem,在这里面会先计算hash值,hash = PyObject_Hash(PyObject*)。在最后,会根据装载率来决定当前ma_table指向的内存是否需要扩容,因为装载率高了,hash冲突的概率就会加大。

  15. PyDict使用的缓冲池技术和Int这些类似,都是在一个Object销毁时加入到缓冲池中。

python源码剖析-笔记2相关推荐

  1. Python源码剖析笔记5-模块机制

    本文简书地址: http://www.jianshu.com/p/14586ec50ab6 python中经常用到模块,比如import xxx,from xxx import yyy这样子,里面的机 ...

  2. python源码剖析笔记1——Python对象初见

    本文简书地址:http://www.jianshu.com/p/763f6cec7a9b 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写, ...

  3. 《Python源码剖析》读书笔记

    <Python源码剖析>电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags ...

  4. python源码剖析代码例子_Python源码剖析笔记5-模块机制

    python中经常用到模块,比如import xxx,from xxx import yyy这样子,里面的机制也是需要好好探究一下的,这次主要从黑盒角度来探测模块机制,源码分析点到为止,详尽的源码分析 ...

  5. Python猫荐书系统之四:《Python源码剖析》

    大家好,新一期的荐书栏目如期跟大家见面了. 先来看看今天的主角是谁:<Python源码剖析--深度探索动态语言核心技术>,2008年出版,作者 @陈儒 ,评分8.7分. 是的,你没看错,出 ...

  6. Python源码剖析[16] —— Pyc文件解析

    Python源码剖析[16] -- Pyc文件解析 2008-02-28 18:29:55|  分类: Python |举报 |字号 订阅 Python源码剖析 --Pyc文件解析 本文作者: Rob ...

  7. python源码剖析 豆瓣_在数据分析师的分析中豆瓣的书那些值得读

    最近总是有人问我有什么书好推荐看看,特烦.但是看到那么多人问,看来挺多人有这个需求,便想了一下,如何通过数据分析找到值得看的书.通过爬取某个标签例如产品,运营获取对应已经打了标签的书,获取书对应的评分 ...

  8. Python发展的新时代—冯大辉先生谈《Python源码剖析》

    Python 3.0 beta 1终于在 6 月 18 号发布了,依照Python一贯主张的简洁,标准,统一精神,Beta版的新特性让我们惊喜的发现,Python正如我们所期望的那样已经进入了一个蓬勃 ...

  9. Python源码剖析[1] —— 编译Python

    [ 绝对原创,转载请注明出处] 注意 :第一部分Python总体架构采用了网络文档<The Architecture of Python>,这是网络上唯一可见的以剖析Python实现为己任 ...

  10. Python源码剖析2-字符串对象PyStringObject

    二. 1.PyStringObject与 PyString_Type PyStringObject是变长对象中的不可变对象.当创建了一个PyStringObject对象之后,该对象内部维护的字符串就不 ...

最新文章

  1. mysql优化思维引导一
  2. 理解js中的this指向以及call,apply,bind方法
  3. SSD 通俗易懂介绍
  4. 【引用】phpmyadmin提示Access denied for user 'root'@'localhost' (using password: NO)的解决办法...
  5. 光用滴答清单也可以专注学习
  6. C#一元运算重载的深入理解
  7. centos8调整分辨率_Hyper-V 设置 CentOS 8 文本模式下分辨率
  8. centos php redhat,RHEL / CentOS 安装 OPcache 提升 PHP 效能
  9. 用css3和html实现创建 Christmas Tree Ornaments(baubles)
  10. IT职场人生系列之三:第一份工作
  11. iOS:实现邮件和短信发送的简单示例
  12. 编曲时如何在FL Studio卷帘窗口修改单个音符音量
  13. mybatis结果的组装(springboot)
  14. gateway 过滤器执行顺序_Spring Boot实战之:轻松搞定拦截器与过滤器
  15. OpenJDK8 JAVA应用窗口在不同缩放比例下的表现(Linux)
  16. 系统集成项目管理工程师笔记
  17. 计算机系大学生为什么选择在CSDN写博客?
  18. 探索性与验证性因子分析
  19. 手机html编辑器微信,135微信(135编辑器手机版网页版)
  20. 由于启用计算机,win10由于启动计算机时出现了页面文件配置问题的详细解决方案...

热门文章

  1. 吉米多维奇数学分析习题集每日一题--泰勒公式习题1378
  2. .Net程序逆向入门教程
  3. 魔方栈源码-网站在线玩魔方源码-云魔方
  4. 高德地图-AndroidStadio-No implementation found for long com.autonavi.amap.mapcore.MapCore.nativeNewInsta
  5. Handmade Hero全程直播游戏引擎开发
  6. Faster-RCNN.Pytorch的使用
  7. WAP PUSH解析(1)——SMS PDU编码
  8. c语言实现lcd显示自动滚动,lcd1602实现字幕滚动原理_lcd1602滚动显示程序
  9. springboot easyexcel 导出excel案例及文件无法打开
  10. gnome黑屏 ubuntu_Ubuntu 16.04+GTX970 黑屏无法安装解决方法