科班出身的码畜一直被灌输一条上帝圣经:“一个int占4个字节,一个char占1个字节,一个float占4个字节。。。”,
今天看下了python的getsizeof函数,发现python中各个基本数据类型(对象)占用的内存大小和c++/Java完全不一样~
前提概述:python中一切都是对象,so python中其实根本不存在int float这些类型,int其实是一个python对象。
int:28float:24string:54list():64{}:288ste():224
此外,
(1)sys.getsizeof只计算实际使用的内存大小,引用所消耗的内存大小不计算。
(2)sys.getsizeof只能作为计算内存大小的参考~
这里有一个问题,为什么python各个数据类型占用大小和c++中不一致呢?
这里本质上是由python的实现所决定的,python代码在运行的时候会由python解析器执行,具体会解析为C语言的某种结构。也就是说,python中的一个int(或其他)映射到c语言中会是一种复杂结构体。
以python的int为例说明,下面是python的int在C中的具体形式:
1
2
3
4
|
typedef struct { PyObject_HEAD long ob_ival; } PyIntObject; |
1
2
3
4
5
6
|
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倍大小!
发现没有,python实际的值只是相应C结构中的一个属性,难怪python的int占28个字节,而C语言只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍大小!
ps:想要精准控制内存大小,使用c++或者Java吧~
补充:使用 sys.getsizeof 查看 python 对象的内存占用
使用 sys.getsizeof 方法可以查看 python 对象的内存占用,单位:字节 (byte)
实际上是调用了 __sizeof__ 方法:
1
2
3
4
5
6
7
|
In [ 35 ]: import sys In [ 36 ]: sys.getsizeof( 'hello world' ) Out[ 36 ]: 60 In [ 37 ]: 'hello world' .__sizeof__() Out[ 37 ]: 60 |
有些数据类型在 Python3 和 Python2 中占用的内存是不同的,
例如 range :
1
2
3
4
5
6
7
8
9
10
11
12
|
# python3 In [ 38 ]: sys.getsizeof( range ( 999 )) Out[ 38 ]: 48 In [ 39 ]: sys.getsizeof( iter ( range ( 999 ))) Out[ 39 ]: 48 # python2 >>> sys.getsizeof( range ( 999 )) 8064 >>> sys.getsizeof( iter ( range ( 999 ))) 64 |
关于这个值是怎么算出来的,有待研究~
暂时已知:这个值包括该对象的数值、签名(包括数据类型、参数、调用方式等)等一系列数据所占总内存。可变对象所占内存可能极小,因为对象是指针,指向很大的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
In [ 65 ]: s = sys.getsizeof In [ 66 ]: s( 1 ) Out[ 66 ]: 28 In [ 67 ]: s( 11 ) Out[ 67 ]: 28 In [ 68 ]: s( 11111111 ) Out[ 68 ]: 28 In [ 69 ]: s( 1111111111 ) Out[ 69 ]: 32 |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qm5132/article/details/100557950