说到计算机中的整型,相信很多人都会联想到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中的整型占多少个字节?相关推荐

  1. python中int函数是什么作用_python中int函数怎么用

    python中int函数怎么用,字符串,函数,数字,出现在,赋值 python中int函数怎么用 易采站长站,站长之家为您整理了python中int函数怎么用的相关内容. int() 函数用于将一个字 ...

  2. python中int函数的用法浅析_python中int函数怎么用,

    详细内容 int() 函数用于将一个字符串会数字转换为整型.接下来通过本文给大家介绍python 中的int()函数的相关知识,感兴趣的朋友一起看看吧 int(x, [base]) 功能: 函数的作用 ...

  3. python中int表示的数据类型是_python中的基本数据类型之 int bool str

    一.基本数据类型 1. int  ==>  整数.主要用来进行数学运算. 2.str  ==>  字符串.可以保存少量的数据,并进行相应的操作. 3.bool  =>  布尔值.判断 ...

  4. python中int函数的用法浅析_Python中int()函数的用法浅析

    int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int) Help on class int in module __builtin__ ...

  5. python中int是什么的缩写_python中int是什么类型

    python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值 整形变量 浮点型变量 字符型 2:可以一个给多个变量赋值,也可以多个给多个变量赋值 3:python3中有6个标 ...

  6. python中int和eval的区别_python中eval与int的区别浅析

    python中eval和int的区别是什么?下面给大家介绍一下: 1.eval()函数 eval()能够以Python表达式的方式解析并执行字符串,并将返回结果输出.eval()函数将去掉字符串的两个 ...

  7. python中int和input的区别_python中input()与raw_input()的区别分析

    使用input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的 纯数字输入 当输入为纯数字时 input返回的是数值类型,如int,float ra ...

  8. python中int占几个字节_Python中int占几个字节

    Python中int占几个字节 以python3版本为例说明, int 类型在python中是动态长度的.因为python3中int类型是长整型,理论支持无限大的数字,但它的结构其实也很简单, 在 l ...

  9. python中int和float的区别_Python学习(四)数据结构 —— int float

    Python 数字类型 int float 数字常量 int: 一般的整数, long: 长整型,2.x版本需在数字后加 "L" 或 "l" ,表示长整型 如 ...

最新文章

  1. 2014年工作中遇到的10个问题:221-230
  2. [软件工程] 查找二维数组最大子数组的之和 郭莉莉李亚文
  3. 在html中超链接_4.html5中超链接
  4. Weblogic EJB 学习笔记(3)精
  5. jedispool redis哨兵_通过java哨兵JedisSentinelPool代码示例连接对配置的redis哨兵主从模式进行测试验证...
  6. empinfo Oracle数据库,Oracle数据库中相关技术详细操作
  7. Linux 下自动化脚本安装Jdk、Nginx等软件
  8. Spring properties dependency checking
  9. 你被选中了——晚会上的随机点名
  10. 某易跟帖频道,接口溯源分析,反爬新技巧,必掌握一下
  11. Revit二次开发小技巧(十二)创建带洞口的墙
  12. 五年级上册计算机教学工作计划,小学五年级上册信息技术教学工作计划(精选5篇)...
  13. 如何解决div里面的h4标题拖拽,并且实现div里面的文本能够选中和不能选中的问题
  14. 不同VLAN下实现网络互相通信(配置port trunk pvid vlan进行数据转发)
  15. 针对Excel 中“剪贴板出现问题,但你仍可在此工作簿内粘贴内容”的解决方案
  16. 数据库SQL笔试题目
  17. MIMIKATZ编译教程
  18. Bmap离线地图实现原理简介
  19. 一种光谱无损的遥感数据融合方法——LiIFT插值融合(一)
  20. 在线客服聊天系统源码_美观强大golang内核开发_二进制运行傻瓜式安装_附搭建教程...

热门文章

  1. 复合消隐信号的作用_黑白全电视信号的组成
  2. Qt —— QVector
  3. win7系统旗舰版path
  4. 传感器信号 如何发送到服务器,传感器采集到的数据通过无线传输至监控服务器的四种方式...
  5. ajax同步请求的处理办法
  6. 不停刷朋友圈的人_还在为每天不停刷朋友圈烦恼吗?只要一个步骤轻松戒掉朋友圈...
  7. 更改Anaconda-Jupyter notebook默认浏览器
  8. python自学做题记录之小学数学N合一
  9. 《Android开发高手课》学习笔记
  10. 比360都好用的删除文件方式