python-sys.getsizeof的使用
科班出身的码畜一直被灌输一条上帝圣经:“一个int占4个字节,一个char占1个字节,一个float占4个字节。。。”,
今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占用的内存大小和c++/Java完全不一样~
前提概述:python中一切都是对象,so python中其实根本不存在int float这些类型,int其实是一个python对象。
int:28
float:24
string:54
list():64
{}:288
ste():224
此外,
(1)sys.getsizeof只计算实际使用的内存大小,引用所消耗的内存大小不计算。
(2)sys.getsizeof只能作为计算内存大小的参考~
这里有一个问题,为什么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倍大小!
ps:想要精准控制内存大小,使用c++或者Java吧~
更多学习笔记可以关注我的微信公众号「kelly学挖掘」,欢迎交流。
参考资料:
https://www.laurentluce.com/posts/python-integer-objects-implementation/
https://jakevdp.github.io/PythonDataScienceHandbook/02.01-understanding-data-types.html
https://www.python.org/dev/peps/pep-0237/
————————————————
版权声明:本文为CSDN博主「我是乔木」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qm5132/article/details/100557950