python中sizeof的⽤法说明
科班出⾝的码畜⼀直被灌输⼀条上帝圣经:“⼀个int占4个字节,⼀个char占1个字节,⼀个float占4个字节。。。”,
今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占⽤的内存⼤⼩和c++/Java完全不⼀样~
前提概述:python中⼀切都是对象,so python中其实根本不存在int float这些类型,int其实是⼀个python对象。
int:28float:24string:54list():64{}:288ste():224
此外,
(1)sizeof只计算实际使⽤的内存⼤⼩,引⽤所消耗的内存⼤⼩不计算。
(2)sizeof只能作为计算内存⼤⼩的参考~
这⾥有⼀个问题,为什么python各个数据类型占⽤⼤⼩和c++中不⼀致呢?
这⾥本质上是由python的实现所决定的,python代码在运⾏的时候会由python解析器执⾏,具体会解析为C语⾔的某种结构。也就是说,python中的⼀个int(或其他)映射到c语⾔中会是⼀种复杂结构体。
以python的int为例说明,下⾯是python的int在C中的具体形式:
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
struct _longobject {
long ob_refcnt;  // 引⽤计数
PyTypeObject *ob_type; //变量类型
size_t ob_size;  //实际占⽤内容⼤⼩
long ob_digit[1];  //存储的实际python值
};
发现没有,python实际的值只是相应C结构中的⼀个属性,难怪python的int占28个字节,⽽C语⾔只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍⼤⼩!
发现没有,python实际的值只是相应C结构中的⼀个属性,难怪python的int占28个字节,⽽C语⾔只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍⼤⼩!
ps:想要精准控制内存⼤⼩,使⽤c++或者Java吧~
补充:使⽤ sizeof 查看 python 对象的内存占⽤
使⽤ sizeof ⽅法可以查看 python 对象的内存占⽤,单位:字节 (byte)
实际上是调⽤了 __sizeof__ ⽅法:
In [35]: import sys
In [36]: sizeof('hello world')
Out[36]: 60
In [37]: 'hello world'.__sizeof__()
Out[37]: 60
有些数据类型在 Python3 和 Python2 中占⽤的内存是不同的,
例如 range :
get out of# python3
In [38]: sizeof(range(999))
Out[38]: 48
In [39]: sizeof(iter(range(999)))
Out[39]: 48
# python2
>>> sizeof(range(999))
8064
>>> sizeof(iter(range(999)))
64
关于这个值是怎么算出来的,有待研究~
暂时已知:这个值包括该对象的数值、签名(包括数据类型、参数、调⽤⽅式等)等⼀系列数据所占总内存。可变对象所占内存可能极⼩,因为对象是指针,指向很⼤的数据。
In [65]: s = sizeof
In [66]: s(1)
Out[66]: 28
In [67]: s(11)
Out[67]: 28
In [68]: s(11111111)
Out[68]: 28
In [69]: s(1111111111)
Out[69]: 32
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。