科班出身的碼畜一直被灌輸一條上帝圣經:“一個int占4個字節(jié),一個char占1個字節(jié),一個float占4個字節(jié)。。?!?,
今天看下了python的getsizeof函數(shù),發(fā)現(xiàn)python中各個基本數(shù)據類型(對象)占用的內存大小和c++/Java完全不一樣~
前提概述:python中一切都是對象,so python中其實根本不存在int float這些類型,int其實是一個python對象。
int:28float:24string:54list():64{}:288ste():224
此外,
(1)sys.getsizeof只計算實際使用的內存大小,引用所消耗的內存大小不計算。
(2)sys.getsizeof只能作為計算內存大小的參考~
這里有一個問題,為什么python各個數(shù)據類型占用大小和c++中不一致呢?
這里本質上是由python的實現(xiàn)所決定的,python代碼在運行的時候會由python解析器執(zhí)行,具體會解析為C語言的某種結構。也就是說,python中的一個int(或其他)映射到c語言中會是一種復雜結構體。
以python的int為例說明,下面是python的int在C中的具體形式:
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
struct _longobject {
long ob_refcnt; // 引用計數(shù)
PyTypeObject *ob_type; //變量類型
size_t ob_size; //實際占用內容大小
long ob_digit[1]; //存儲的實際python值
};
發(fā)現(xiàn)沒有,python實際的值只是相應C結構中的一個屬性,難怪python的int占28個字節(jié),而C語言只需要4個字節(jié),因為python還存儲了很多相關的其他信息!其他信息是實際數(shù)值的6倍大??!
發(fā)現(xiàn)沒有,python實際的值只是相應C結構中的一個屬性,難怪python的int占28個字節(jié),而C語言只需要4個字節(jié),因為python還存儲了很多相關的其他信息!其他信息是實際數(shù)值的6倍大小!
ps:想要精準控制內存大小,使用c++或者Java吧~
補充:使用 sys.getsizeof 查看 python 對象的內存占用
使用 sys.getsizeof 方法可以查看 python 對象的內存占用,單位:字節(jié) (byte)
實際上是調用了 __sizeof__ 方法:
In [35]: import sys
In [36]: sys.getsizeof('hello world')
Out[36]: 60
In [37]: 'hello world'.__sizeof__()
Out[37]: 60
有些數(shù)據類型在 Python3 和 Python2 中占用的內存是不同的,
例如 range :
# 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
關于這個值是怎么算出來的,有待研究~
暫時已知:這個值包括該對象的數(shù)值、簽名(包括數(shù)據類型、參數(shù)、調用方式等)等一系列數(shù)據所占總內存??勺儗ο笏純却婵赡軜O小,因為對象是指針,指向很大的數(shù)據。
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
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Python getsizeof()和getsize()區(qū)分詳解
- python—sys模塊之獲取參數(shù)的操作
- 解決python中os.system調用exe文件的問題
- 使用Python對Syslog信息進行分析并繪圖的實現(xiàn)
- python中sys模塊的介紹與實例
- python sys.stdin和sys.stdout的用法說明