python 中sys.getsizeof的用法說(shuō)明
科班出身的碼畜一直被灌輸一條上帝圣經(jīng):“一個(gè)int占4個(gè)字節(jié),一個(gè)char占1個(gè)字節(jié),一個(gè)float占4個(gè)字節(jié)。。?!保?/p>
今天看下了python的getsizeof函數(shù),發(fā)現(xiàn)python中各個(gè)基本數(shù)據(jù)類型(對(duì)象)占用的內(nèi)存大小和c++/Java完全不一樣~
前提概述:python中一切都是對(duì)象,so python中其實(shí)根本不存在int float這些類型,int其實(shí)是一個(gè)python對(duì)象。
int:28float:24string:54list():64{}:288ste():224
此外,
(1)sys.getsizeof只計(jì)算實(shí)際使用的內(nèi)存大小,引用所消耗的內(nèi)存大小不計(jì)算。
(2)sys.getsizeof只能作為計(jì)算內(nèi)存大小的參考~
這里有一個(gè)問(wèn)題,為什么python各個(gè)數(shù)據(jù)類型占用大小和c++中不一致呢?
這里本質(zhì)上是由python的實(shí)現(xiàn)所決定的,python代碼在運(yùn)行的時(shí)候會(huì)由python解析器執(zhí)行,具體會(huì)解析為C語(yǔ)言的某種結(jié)構(gòu)。也就是說(shuō),python中的一個(gè)int(或其他)映射到c語(yǔ)言中會(huì)是一種復(fù)雜結(jié)構(gòu)體。
以python的int為例說(shuō)明,下面是python的int在C中的具體形式:
typedef struct { PyObject_HEAD long ob_ival;} PyIntObject;
struct _longobject { long ob_refcnt; // 引用計(jì)數(shù) PyTypeObject *ob_type; //變量類型 size_t ob_size; //實(shí)際占用內(nèi)容大小 long ob_digit[1]; //存儲(chǔ)的實(shí)際python值};
發(fā)現(xiàn)沒(méi)有,python實(shí)際的值只是相應(yīng)C結(jié)構(gòu)中的一個(gè)屬性,難怪python的int占28個(gè)字節(jié),而C語(yǔ)言只需要4個(gè)字節(jié),因?yàn)閜ython還存儲(chǔ)了很多相關(guān)的其他信息!其他信息是實(shí)際數(shù)值的6倍大小!
發(fā)現(xiàn)沒(méi)有,python實(shí)際的值只是相應(yīng)C結(jié)構(gòu)中的一個(gè)屬性,難怪python的int占28個(gè)字節(jié),而C語(yǔ)言只需要4個(gè)字節(jié),因?yàn)閜ython還存儲(chǔ)了很多相關(guān)的其他信息!其他信息是實(shí)際數(shù)值的6倍大小!
ps:想要精準(zhǔn)控制內(nèi)存大小,使用c++或者Java吧~
補(bǔ)充:使用 sys.getsizeof 查看 python 對(duì)象的內(nèi)存占用
使用 sys.getsizeof 方法可以查看 python 對(duì)象的內(nèi)存占用,單位:字節(jié) (byte)
實(shí)際上是調(diào)用了 __sizeof__ 方法:In [35]: import sysIn [36]: sys.getsizeof(’hello world’)Out[36]: 60In [37]: ’hello world’.__sizeof__()Out[37]: 60
有些數(shù)據(jù)類型在 Python3 和 Python2 中占用的內(nèi)存是不同的,
例如 range :# python3In [38]: sys.getsizeof(range(999))Out[38]: 48In [39]: sys.getsizeof(iter(range(999)))Out[39]: 48# python2>>> sys.getsizeof(range(999))8064>>> sys.getsizeof(iter(range(999)))64
關(guān)于這個(gè)值是怎么算出來(lái)的,有待研究~
暫時(shí)已知:這個(gè)值包括該對(duì)象的數(shù)值、簽名(包括數(shù)據(jù)類型、參數(shù)、調(diào)用方式等)等一系列數(shù)據(jù)所占總內(nèi)存。可變對(duì)象所占內(nèi)存可能極小,因?yàn)閷?duì)象是指針,指向很大的數(shù)據(jù)。
In [65]: s = sys.getsizeofIn [66]: s(1)Out[66]: 28In [67]: s(11)Out[67]: 28In [68]: s(11111111)Out[68]: 28In [69]: s(1111111111)Out[69]: 32
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Python importlib動(dòng)態(tài)導(dǎo)入模塊實(shí)現(xiàn)代碼2. 在Android中使用WebSocket實(shí)現(xiàn)消息通信的方法詳解3. .NET中l(wèi)ambda表達(dá)式合并問(wèn)題及解決方法4. 利用promise及參數(shù)解構(gòu)封裝ajax請(qǐng)求的方法5. 淺談python出錯(cuò)時(shí)traceback的解讀6. python matplotlib:plt.scatter() 大小和顏色參數(shù)詳解7. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向8. Nginx+php配置文件及原理解析9. JSP數(shù)據(jù)交互實(shí)現(xiàn)過(guò)程解析10. windows服務(wù)器使用IIS時(shí)thinkphp搜索中文無(wú)效問(wèn)題
