python不同类型对内存的使用

首先先看一个计算机中的概念
1. bit就是位,也叫比特位,是计算机表示数据最小的单位, 它是长度为8的一串二进制码
2. byte就是字节 1 byte=8 bit 也就是 1 B
3. 1 KB=1024 B

python可以使用 sys 中的 getsizeof函数来获取各种数据类型(对象)占用的内存大小

使用方式:

>>> import sys
>>> sys.getsizeof(1)    # out: 28
>>> sys.getsizeof(1.0)  # out: 24
>>> sys.getsizeof('1')  # out: 50

在c 语言中int 是占4个字节, 为什么int 会是28 Bytes个呢?
stackoverflow 给出了一个python内存占用的列表:python内存使用情况
在这里插入图片描述
这里有提到一个 +4 bytes about every 30 powers of 2
翻译成中文就是: 每2 ** 30内存的占用就增加4个字节

sys.getsizeof(2**29)  # out: 28
sys.getsizeof(2**30)  # out: 32
sys.getsizeof(2**59)  # out: 32
sys.getsizeof(2**60)  # out: 36

回到上面的问题: 那么在python中int类型为什么就要占用28 Bytes个呢?
先看个demo:

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> sys.getsizeof(a)
136
>>> sum([sys.getsizeof(i) for i in a])
280

可以发现列表 a 竟然要比单个元素内存累加的要小, 这说明里面的元素并非仅仅是一个int 类型的数字,
它应该还携带了一些别的东西, 这时候我想起经典的一句话: 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 int 的实际的值只是相应C结构中的一个属性, 这也就是为什么python中的int 不是4个字节而是28

就在我满心欢喜的时候突然又发现一个问题:
在这里插入图片描述
为什么在 python3.7 和3.8 的结果不一致呢?
意外的发现: 这里只能去c语言的源码里面找结果了

python中c语言部分参考文档: https://blog.csdn.net/qm5132/article/details/100557950

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值