首先先看一个计算机中的概念 1. bit就是位,也叫比特位,是计算机表示数据最小的单位, 它是长度为8的一串二进制码 2. byte就是字节 1 byte=8 bit 也就是 1 B 3. 1 KB=1024 B
python可以使用 sys 中的 getsizeof函数来获取各种数据类型(对象)占用的内存大小
使用方式:
>>> import sys
>>> sys.getsizeof(1)
>>> sys.getsizeof(1.0)
>>> sys.getsizeof('1')
在c 语言中int 是占4个字节, 为什么int 会是28 Bytes个呢? stackoverflow 给出了一个python内存占用的列表:python内存使用情况 这里有提到一个 +4 bytes about every 30 powers of 2 翻译成中文就是: 每2 ** 30内存的占用就增加4个字节
sys.getsizeof(2**29)
sys.getsizeof(2**30)
sys.getsizeof(2**59)
sys.getsizeof(2**60)
回到上面的问题: 那么在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 int 的实际的值只是相应C结构中的一个属性, 这也就是为什么python中的int 不是4个字节而是28
就在我满心欢喜的时候突然又发现一个问题: 为什么在 python3.7 和3.8 的结果不一致呢? 意外的发现: 这里只能去c语言的源码里面找结果了
python中c语言部分参考文档: https://blog.csdn.net/qm5132/article/details/100557950
|