python3 整数类型PyLongObject 和PyObject源码分析
一 测试环境介绍和准备
测试环境:
操作系统:windows10
Python版本:3.7.0 下载地址
VS版本:vs2015社区版(免费) 下载地址
win10SDK(安装vs2015是可以选择,如果没有安装则需要独立安装)
二 如何查看源码
1 下载python源码
下载后解压缩
使用vs2015或者vs2017打开
Python-3.7.0\PCbuild\pcbuild.sln 解决方案文件
打开pythoncore项目可以找到\include\object.h文件
 
三 源码分析
python源码版本 python3.7.0
在python中所有的类型都可以转为PyObject类型,单python用的是c语言,并没有继承机制,我们可以通过源码看它试如何实现的,我们先看PyObject源码
1 PyObject 源码
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
 
1-1 _PyObject_HEAD_EXTRA 源码
我们先看第一个成员是一个宏 _PyObject_HEAD_EXTRA,这个宏是如下定义
#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA \
struct _object *_ob_next; \
struct _object *_ob_prev;
 
#define _PyObject_EXTRA_INIT 0, 0,
 
#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif
 
通过代码我们可以看出,它根据环境给_PyObject_HEAD_EXTRA设置的值有可能是空的,或者是一个双向链表。通过编译代码我们知道,他在debug版本的python中是用的双向链表,而在release版本中是空。
1-2 Py_ssize_t ob_refcnt 引用计数
Py_ssize_t 类型在32位程序中就是int,在64位win程序中是__int64
引用计数的策略后面我们专门写文章分析
1-3 struct _typeobject *ob_type;
源码比较长,就不全部列出来,这个结构体中包含了一个PyObject对象的所有相关操作函数和属性,比如对象创建和销毁函数,print对象的序列化函数等,存储方式都是通过函数指针。所以每种python类型都会对各类操作函数指针做赋值设定。
其中的PyObject_VAR_HEAD宏内容如下
typedef struct {
PyObject ob_base;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
 
 
2 PyLongObject 整数对象
 
digit
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
 
 
2-1 小数预处理
对于比较小的数(-5到257 )直接返回初始化好的值,所以说大量的小整数时,不会新增额外的空间
do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
return get_small_int((sdigit)ival); \
} while(0)
 
2-2 按照数字的发小分配空间,以unsigned short为单位
数字少于16位也就是2个字节的,用一个digit (unsigned short) 存放
数字少于32位也就是4个字节的,用两个个digit (unsigned short) 存放
2-3 大数处理
如果是超大数,就用多个字节存放,由于变量就是一个 unsigned long,先看一下源码:
对于不同的系统,大数能表示的范围不一致,因为数字采用的是unsigned long存放,在不同的系统大小不一致,可以见如下表
 
其中 windows 64位使用的是 LLP64所以 在window中python数字的最大值也就是4个字节,如果用它来存放64位指针的地址,就会丢失数据。
在linux(ubuntu16.04 64)使用的是LP64,,所以数字最大值就是8个字节。
 
相关视频可以观看

http://laoxiaketang.com/python.html

python3 整数类型PyLongObject 和PyObject源码分析的更多相关文章

  1. ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用.一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能有一个(前文以作介绍),一般用了数据库 ...

  2. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  3. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

  4. jQuery源码分析系列(转载来源Aaron.)

    声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...

  5. jQuery源码分析系列——来自Aaron

    jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...

  6. Redis学习之intset整数集合源码分析

    1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 ...

  7. jQuery源码分析系列(36) : Ajax - 类型转化器

    什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的 ...

  8. SparkRPC源码分析之RPC管道与消息类型

    SparkRPC源码分析之RPC管道与消息类型我们前面看过了netty基础知识扫盲,那我们应该明白,ChannelHandler这个组件内为channel的各种事件提供了处理逻辑,也就是主要业务逻辑写 ...

  9. angular源码分析:angular中脏活累活承担者之$parse

    我们在上一期中讲 $rootscope时,看到$rootscope是依赖$prase,其实不止是$rootscope,翻看angular的源码随便翻翻就可以发现很多地方是依赖于$parse的.而$pa ...

随机推荐

  1. SmartSql Cache标签

    Demo <Cache Id="T_Test.LruCache" Type="Lru"> <Parameter Key="Cache ...

  2. 《C#并发编程经典实例》学习笔记—2.5 等待任意一个任务完成 Task.WhenAny

    问题 执行若干个任务,只需要对其中任意一个的完成进行响应.这主要用于:对一个操作进行多种独立的尝试,只要一个尝试完成,任务就算完成.例如,同时向多个 Web 服务询问股票价格,但是只关心第一个响应的. ...

  3. 15个常用的javaScript正则表达式

    1 用户名正则 //用户名正则,4到16位(字母,数字,下划线,减号) ,}$/; //输出 true console.log(uPattern.test("iFat3")); 2 ...

  4. Sublime Text3介绍和插件安装——基于Python开发

    Subime编辑器是一款轻量级的代码编辑器,是收费的,但是可以无限期使用.官网下载地址:https://www.sublimetext.com. Sublime Text3支持语言开发种类多样,几乎可 ...

  5. npm ERR! asyncWrite is not a function

    1.背景:原先node是官网下载安装的,通过brew更新了下,然后到项目里npm i 安装包时候,报错2.解决:卸载官网下载安装的node,重装 sudo rm -rf /usr/local/{bin ...

  6. HotSpot jdk 资料汇总

    http://www.oracle.com/technetwork/java/index.html https://bugs.java.com/bugdatabase/ https://docs.or ...

  7. HTML5 新增的 input 事件

    以往 HTML 的 input 輸入框,無法即時反映使用者的輸入內容.onkeyup.onkeydown 事件,無法即時.精確地取得使用者的輸入資料:而 onchange.onblur 事件,要等到失 ...

  8. Netty 核心内容之 编解码器

    原文链接 Netty 核心内容之 编解码器 代码仓库地址 编解码器 我认为Netty 最棒的一点就是Netty 设计的编解码链,这一优秀的设计,可以很方便的实现二进制流->ByteBuf-> ...

  9. Python 经典面试题汇总之基础篇

    基础篇 1:为什么学习Python 公司建议使用Python,然后自己通过百度和向有学过Python的同学了解了Python.Python这门语言,入门比较简单,它简单易学,生态圈比较强大,涉及的地方 ...

  10. jquery实现静态柱形图(写死的数据,只为系统首页UI更美观)

    这段时间比较空闲,便阅读公司做好的项目的源代码,学习学习同事的开发思路. 在项目中使用图表可以很好地提高人机交互的友好度,开发的时候看到项目的首页有两个很小的柱形图,很漂亮,便找到对应的代码看了看,发 ...