python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析

python3 整数类型PyLongObject 和PyObject源码分析

一 测试环境介绍和准备

测试环境:

操作系统:windows10

Python版本:3.7.0 下载地址

VS版本:vs2015社区版(免费) 下载地址

win10SDK(安装vs2015是可以选择,如果没有安装则需要独立安装)

http://ffmpeg.club/python

二 如何查看源码

1 下载python源码

https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

http://www.ffmpeg.club/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://edu.51cto.com/course/15278.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从“嵌入式”到“物联网”有哪些变化?

简介&#xff1a; 经过几十年发展&#xff0c;嵌入式技术已经用在了我们生活中的方方面面&#xff0c;但是嵌入式始终都带有小众&#xff0c;专业性强的属性&#xff0c;让很多非嵌入式领域的同学望而却步。近十几年的发展&#xff0c;物联网覆盖了越来越多领域&#xff0c;包括…

java 接口 详解_Java 接口详解

接口接口是功能的集合&#xff0c;同样可看做是一种数据类型&#xff0c;是比抽象类更为抽象的”类”。接口只描述所应该具备的方法&#xff0c;并没有具体实现&#xff0c;具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离&#xff0c;优化了程…

Serverless Devs 的官网是如何通过 Serverless Devs 部署的

简介&#xff1a; 只有自己吃自己的狗粮&#xff0c;自己做的东西才不“&#x1f436;”。Serverless Devs 自发展之处到现在&#xff0c;已经经历了几个月的时间&#xff0c;在这几个月&#xff0c;Serverless Devs 的成长是迅速的&#xff0c;这很大一部分的原因是“我们在吃…

crontab 改成只读模式_以“三合一”模式推动提质增效 助力公司高质量发展

近日&#xff0c;模块制造厂圆满完成位于原化机西部院内的吉林制造基地新老厂区的资源整合、机械设备修理以及厂区内设备土建基础施工、功能配套设备购置等工作&#xff0c;积极推进新厂区环评、厂区注册地址变更&#xff0c;使制造基地继承了老厂区所拥有的压力容器、超限设备…

5G 落地进入爆发期,是时候让毫米波登场了

作者 | 小枣君来源 | 鲜枣课堂2021年&#xff0c;全球5G网络建设和发展取得了不俗的成绩。根据GSA于8月发布的数据&#xff0c;已有70多个国家及地区的超过175家运营商&#xff0c;推出了5G商用服务。还有285家运营商&#xff0c;正在投资部署5G。中国的5G建设步伐&#xff0c;…

新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析

简介&#xff1a; 作为新型反射类型&#xff0c;目前仍存绕过防御可能性。 阿里云安全近期发现利用STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT会话穿越应用程序&#xff09;服务发起的DDoS反射攻击。阿里云DDoS防护系统在秒级识别到攻击&#xff0c…

ssh是什么_【科普】SSH都不懂,还搞什么网络

关注我&#xff0c;你的眼睛会怀孕今天小编为大家分享一篇关于SSH 的介绍和使用方法的文章。本文从SSH是什么出发&#xff0c;讲述了SSH的基本用法&#xff0c;之后在远程登录、端口转发等多种场景下进行独立的讲述&#xff0c;希望能对大家有所帮助。1. 什么是SSH&#xff1f;…

java restful中文乱码_restful服务接口访问乱码 和 505错误

标签&#xff1a;用cxf 发部个rest服务&#xff0c;用浏览器访问和 HttpURLConnection 访问。1. URL中有中文&#xff0c;浏览器访问正常&#xff0c;HttpURLConnection 失败。解决&#xff1a; HttpURLConnection 方式需要做兼容处理。queryParam 传入参数&#xff0c;服务实现…

10问10答:你真的了解线程池吗?

简介&#xff1a; 《Java开发手册》中强调&#xff0c;线程资源必须通过线程池提供&#xff0c;而创建线程池必须使用ThreadPoolExecutor。手册主要强调利用线程池避免两个问题&#xff0c;一是线程过渡切换&#xff0c;二是避免请求过多时造成OOM。但是如果参数配置错误&#…

浪潮K1 Power通过ISO/IEC 20243标准认证

日前&#xff0c;浪潮K1 Power服务器通过ISO/IEC 20243标准认证&#xff0c;成为中国第一个通过该认证的服务器产品线。 ISO/IEC 20243标准&#xff0c;也被称为O-TTPS&#xff08;Open Trusted Technology Provider Standards&#xff0c;开放可信技术供应商标准&#xff09;…

「技术人生」第3篇:解决问题的规律总结

简介&#xff1a; 本文将介绍问题研究背景及解决问题的一般规律和特殊规律及二者之间的辩证关系。 作者&#xff1a;贺科学 往期技术一号位方法论系列文章&#xff1a; 「技术人生」专题第1篇&#xff1a;什么是技术一号位&#xff1f; 「技术人生」第2篇&#xff1a;学会分…

python canny优化_python实现canny边缘检测

canny边缘检测原理canny边缘检测共有5部分组成&#xff0c;下边我会分别来介绍。1 高斯模糊(略)2 计算梯度幅值和方向。可选用的模板&#xff1a;soble算子、Prewitt算子、Roberts模板等等;一般采用soble算子&#xff0c;OpenCV也是如此&#xff0c;利用soble水平和垂直算子与输…

java变位词_GoLang 字符串变位词

GoLang 实现func solution(s , t string)bool{if s t {return true}length : len(s)if length ! len(t) {return false}// 32 --> ~ 126const MAX_ASCII int 94const SPACE_INDEX rune 32numbers : [MAX_ASCII]int{}sRune : []rune(s)tRune :[]rune(t)for i : 0 ; i <…

CENTOS 7 踢用户_CentOS服务器及MySQL数据库性能测试-乐搏软件测试

这期小编和大家分享使用Sysbench&#xff0c;进行CentOS服务器及MySQL数据库的性能测试。Sysbench是一个跨平台的基准测试工具。基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑更加简单…

何朝曦:构建云化安全能力的三个建议

11月12日&#xff0c;深信服智安全创新峰会在云端拉开帷幕&#xff0c;深信服创始人&CEO何朝曦在《构建云化时代的安全能力》主题演讲中指出&#xff0c;业务云化已成为用户实现数字化转型与变革的重要方式&#xff0c;这种跨时代的变迁对用户的安全能力提出了更高的要求&a…

dubbo-go v3 版本 go module 踩坑记

简介&#xff1a; 该问题源于我们想对 dubbo-go 的 module path 做一次变更&#xff0c;使用 dubbo.apache.org/dubbo-go/v3 替换之前的 github.com/apache/dubbo-go。 作者 | 董剑辉、盛傲飞 来源 | 阿里巴巴云原生公众号 ​ 问题背景 ​ 该问题源于我们想对 dubbo-go 的 mo…

python 独热码_Python机器学习之独热编码(一)

在机器学习算法中&#xff0c;常会遇到分类特征是离散的&#xff0c;无序的。例如&#xff1a;性别有男、女&#xff0c;城市有北京&#xff0c;上海&#xff0c;深圳等。性别特征&#xff1a;["男"&#xff0c;"女"] > 0&#xff0c;1地区特征&#xf…

php 怎么解析文本,PHP解析自定义纯文本数据库

我有一个文本文件,存储有关不同项目的信息.该文件是结构化的.文件中的每个项目都由大括号{}分隔,并以逗号开头.每个项目都有其拥有的属性列表,并且属性可以存在或不存在.如果不存在,服务器将假定它们为“默认”.每个条目都用大括号括起来,并以逗号结尾&#xff1a;{},该文件还包…

智能数据构建与管理平台Dataphin的前世今生:缘起

简介&#xff1a; 阿里巴巴提出的OneData方法论帮助企业捋清了数据全生命周期的管理思路&#xff0c;更将其植入到产品Dataphin&#xff08;智能数据构建与管理&#xff09;中&#xff0c;通过阿里云为企业提供服务。 Dataphin 智能数据构建与管理平台 面向各行各业大数据建设、…

缓存和数据库一致性问题,看这篇就够了

作者 | Magic Kaito来源 | 水滴与银弹如何保证缓存和数据库一致性&#xff0c;这是一个老生常谈的话题了。但很多人对这个问题&#xff0c;依旧有很多疑惑&#xff1a;到底是更新缓存还是删缓存&#xff1f;到底选择先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓…