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/

 

 -- over --

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值