python中int占几个字节_Python中的整型占多少个字节?
说到计算机中的整型,相信很多人都会联想到32位整型(或者int),是程序员日常生活中用的最多的一种类型。32位整型顾名思义,占用32个位也就是4个字节,取值范围−2,147,483,648~ 2,147,483,647 。C/C++中是4个字节,Java中也是4个字节,但是Python中呢?
我们知道Python中也有int类,而且非常好用,原生支持高精度计算。但是Python中的一个整型到底占用多少字节呢?我相信绝大多数的Python程序员从未想过这一点,越是习以为常的东西越是不会在意它的存在。
在Python中,如果想要知道一个对象所占用的内存大小,只需要使用sys.getsizeof这个API就可以了。那就让我们来试一下不同的整数
1
2
3
4
5
6
print(sys.getsizeof(0))# 24
print(sys.getsizeof(1))# 28
print(sys.getsizeof(2))# 28
print(sys.getsizeof(2**15))# 28
print(sys.getsizeof(2**30))# 32
print(sys.getsizeof(2**128))# 44
从上面的小实验可以看出,一个整型最少要占24字节(0),1开始就要占用28个字节,到了2的30次方开始要占用32个字节,而2的128次方则要占用44个字节。我们可以得到两点规律,1. 字节数随着数字增大而增大。2. 每次的增量是4个字节。 好像至此已经回答了我们的题目中的问题:Python中的整型占多少个字节?答案是:变长的(相对于int32的定长),而且最少24个字节。
你以为本文到这里就结束了吗?那你就图样图森破了。一个整型数2,居然要占用28个字节!这完全了颠覆了我的认知,我一定搞清楚为什么。 在哥们的帮助下,我找到了Python的源码。 https://github.com/python/cpython
Python的官方实现是C语言,所以叫cpython。这也就意味着只要Python还在,C就会不消失。其他实现还有jython(Java), IronPython (.Net), PyPy (Python)。
第一件事情要搞清楚的是Python中int类型在cpython的名字是什么?看了半天,在 longobject.h 中发现了一个叫 PyLongObject 的结构体。然而它只是一个马甲,是 _longobject的别名。在longintrepr.h中找到了 _longobject的定义如下:
1
2
3
4
struct_longobject{
PyObject_VAR_HEAD
digitob_digit[1];
};
在文件的开头就看到了typedef uint32_t digit;,digit就是unit32_t, 每个元素占4个字节。但PyObject_VAR_HEAD又是什么鬼?在object.h中发现了它是个宏,上面的注释倒是挺有意思的。
1
2
3
4
5
6
7
/* PyObject_VAR_HEAD defines the initial segment of all variable-size
container objects. These end with a declaration of an array with 1
element, but enough space is malloc'ed so that the array actually
has room for ob_size elements. Note that ob_size is an element count,
not necessarily a byte count.
*/
definePyObject_VAR_HEADPyVarObjectob_base;
等一下,PyVarObject又是什么?还好定义就在下面。
1
2
3
4
typedefstruct{
PyObjectob_base;
Py_ssize_tob_size;/* Number of items in variable part */
}PyVarObject;
又一层嵌套,是不是已经晕了,继续查看PyObject的定义,这次反而在上面了。
1
2
3
4
5
typedefstruct_object{
_PyObject_HEAD_EXTRA
Py_ssize_tob_refcnt;
struct_typeobject *ob_type;
}PyObject;
有完没完啊?_PyObject_HEAD_EXTRA又是什么?看了一下发现它只在debug build中有定义,这里就不展开了。Py_ssize_t等于ssize_t如果有定义的话, ssize_t在64位的机器上就是long。_typeobject又是什么?感觉应该非常大,不然就不会用指针了。不过话说回来,既然用了指针,我又何必去关心它是什么呢?反正就是8个字节而已,指向一个内存地址。至此真相大了一个白,如果我们把structs flatten, PyLongObject 定义如下:
1
2
3
4
5
6
structPyLongObject{
longob_refcnt;// 8 bytes
struct_typeobject *ob_type;// 8 bytes
longob_size;// 8 bytes
unsignedintob_digit[1];// 4 bytes * abs(ob_size)
};
ob_refcnt引用计数 8个字节,ob_type类型信息 8个字节(指针),ob_size变长部分元素的个数,8个字节。ob_digit变长的数据部分,字节数为4*abs(ob_size),ob_size可以为0,所以最少8+8+8=24字节,每次增量都是4 (unsigned int) 的倍数。这和我们之前观察到的实验结果吻合。
以上都是基于64位的Python,对于32位的版本,定义如下:
1
2
3
4
5
6
structPyLongObject{
intob_refcnt;// 4 bytes
struct_typeobject *ob_type;// 4 bytes
intob_size;// 4 bytes
unsignedshortob_digit[1];// 2 bytes * abs(ob_size)
};
32位就要比64位小很多了,最少12个字节,增量为2个字节。
好了,今天就写到这里。相信你对整型数或者Python有了一个新的认识。下面一篇我们会将会介绍整型数在Python中的表示和计算。
python中int占几个字节_Python中的整型占多少个字节?相关推荐
- python中int函数是什么作用_python中int函数怎么用
python中int函数怎么用,字符串,函数,数字,出现在,赋值 python中int函数怎么用 易采站长站,站长之家为您整理了python中int函数怎么用的相关内容. int() 函数用于将一个字 ...
- python中int函数的用法浅析_python中int函数怎么用,
详细内容 int() 函数用于将一个字符串会数字转换为整型.接下来通过本文给大家介绍python 中的int()函数的相关知识,感兴趣的朋友一起看看吧 int(x, [base]) 功能: 函数的作用 ...
- python中int表示的数据类型是_python中的基本数据类型之 int bool str
一.基本数据类型 1. int ==> 整数.主要用来进行数学运算. 2.str ==> 字符串.可以保存少量的数据,并进行相应的操作. 3.bool => 布尔值.判断 ...
- python中int函数的用法浅析_Python中int()函数的用法浅析
int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builtin__ ...
- python中int是什么的缩写_python中int是什么类型
python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值 整形变量 浮点型变量 字符型 2:可以一个给多个变量赋值,也可以多个给多个变量赋值 3:python3中有6个标 ...
- python中int和eval的区别_python中eval与int的区别浅析
python中eval和int的区别是什么?下面给大家介绍一下: 1.eval()函数 eval()能够以Python表达式的方式解析并执行字符串,并将返回结果输出.eval()函数将去掉字符串的两个 ...
- python中int和input的区别_python中input()与raw_input()的区别分析
使用input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的 纯数字输入 当输入为纯数字时 input返回的是数值类型,如int,float ra ...
- python中int占几个字节_Python中int占几个字节
Python中int占几个字节 以python3版本为例说明, int 类型在python中是动态长度的.因为python3中int类型是长整型,理论支持无限大的数字,但它的结构其实也很简单, 在 l ...
- python中int和float的区别_Python学习(四)数据结构 —— int float
Python 数字类型 int float 数字常量 int: 一般的整数, long: 长整型,2.x版本需在数字后加 "L" 或 "l" ,表示长整型 如 ...
最新文章
- 2014年工作中遇到的10个问题:221-230
- [软件工程] 查找二维数组最大子数组的之和 郭莉莉李亚文
- 在html中超链接_4.html5中超链接
- Weblogic EJB 学习笔记(3)精
- jedispool redis哨兵_通过java哨兵JedisSentinelPool代码示例连接对配置的redis哨兵主从模式进行测试验证...
- empinfo Oracle数据库,Oracle数据库中相关技术详细操作
- Linux 下自动化脚本安装Jdk、Nginx等软件
- Spring properties dependency checking
- 你被选中了——晚会上的随机点名
- 某易跟帖频道,接口溯源分析,反爬新技巧,必掌握一下
- Revit二次开发小技巧(十二)创建带洞口的墙
- 五年级上册计算机教学工作计划,小学五年级上册信息技术教学工作计划(精选5篇)...
- 如何解决div里面的h4标题拖拽,并且实现div里面的文本能够选中和不能选中的问题
- 不同VLAN下实现网络互相通信(配置port trunk pvid vlan进行数据转发)
- 针对Excel 中“剪贴板出现问题,但你仍可在此工作簿内粘贴内容”的解决方案
- 数据库SQL笔试题目
- MIMIKATZ编译教程
- Bmap离线地图实现原理简介
- 一种光谱无损的遥感数据融合方法——LiIFT插值融合(一)
- 在线客服聊天系统源码_美观强大golang内核开发_二进制运行傻瓜式安装_附搭建教程...