首先先看一个计算机中的概念
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