python 中sys.getsizeof的用法說明
科班出身的碼畜一直被灌輸一條上帝圣經(jīng):“一個int占4個字節(jié),一個char占1個字節(jié),一個float占4個字節(jié)。。?!?,
今天看下了python的getsizeof函數(shù),發(fā)現(xiàn)python中各個基本數(shù)據(jù)類型(對象)占用的內(nèi)存大小和c++/Java完全不一樣~
前提概述:python中一切都是對象,so python中其實根本不存在int float這些類型,int其實是一個python對象。
int:28float:24string:54list():64{}:288ste():224
此外,
(1)sys.getsizeof只計算實際使用的內(nèi)存大小,引用所消耗的內(nèi)存大小不計算。
(2)sys.getsizeof只能作為計算內(nèi)存大小的參考~
這里有一個問題,為什么python各個數(shù)據(jù)類型占用大小和c++中不一致呢?
這里本質(zhì)上是由python的實現(xiàn)所決定的,python代碼在運行的時候會由python解析器執(zhí)行,具體會解析為C語言的某種結(jié)構(gòu)。也就是說,python中的一個int(或其他)映射到c語言中會是一種復(fù)雜結(jié)構(gòu)體。
以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; //實際占用內(nèi)容大小 long ob_digit[1]; //存儲的實際python值 };
發(fā)現(xiàn)沒有,python實際的值只是相應(yīng)C結(jié)構(gòu)中的一個屬性,難怪python的int占28個字節(jié),而C語言只需要4個字節(jié),因為python還存儲了很多相關(guān)的其他信息!其他信息是實際數(shù)值的6倍大??!
發(fā)現(xiàn)沒有,python實際的值只是相應(yīng)C結(jié)構(gòu)中的一個屬性,難怪python的int占28個字節(jié),而C語言只需要4個字節(jié),因為python還存儲了很多相關(guān)的其他信息!其他信息是實際數(shù)值的6倍大?。?/p>
ps:想要精準(zhǔn)控制內(nèi)存大小,使用c++或者Java吧~
補充:使用 sys.getsizeof 查看 python 對象的內(nèi)存占用
使用 sys.getsizeof 方法可以查看 python 對象的內(nèi)存占用,單位:字節(jié) (byte)
實際上是調(diào)用了 __sizeof__ 方法:
In [35]: import sys In [36]: sys.getsizeof('hello world') Out[36]: 60 In [37]: 'hello world'.__sizeof__() Out[37]: 60
有些數(shù)據(jù)類型在 Python3 和 Python2 中占用的內(nèi)存是不同的,
例如 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
關(guān)于這個值是怎么算出來的,有待研究~
暫時已知:這個值包括該對象的數(shù)值、簽名(包括數(shù)據(jù)類型、參數(shù)、調(diào)用方式等)等一系列數(shù)據(jù)所占總內(nèi)存。可變對象所占內(nèi)存可能極小,因為對象是指針,指向很大的數(shù)據(jù)。
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
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中的format格式化、填充與對齊、數(shù)字格式化方式
format函數(shù)是Python中強大的字符串格式化方法,它允許程序員通過大括號{}來為字符串中的插入點占位,并通過傳入?yún)?shù)進行替換,{0}、{1}分別代表不同的參數(shù)2024-09-09python使用win32com在百度空間插入html元素示例
這篇文章主要介紹了python使用win32com在百度空間插入html元素的示例,大家參考使用吧2014-02-02Python中OpenCV?Tutorials?20??高動態(tài)范圍成像的實現(xiàn)步驟
這篇文章主要介紹了OpenCV?Tutorials?20?-?高動態(tài)范圍成像,本文還給大家展示了一種稱為曝光融合的替代方法,它可以產(chǎn)生低動態(tài)范圍的圖像,需要的朋友可以參考下2022-06-06將 Ubuntu 16 和 18 上的 python 升級到最新 python3.8 的方法教程
這篇文章主要介紹了如何將 Ubuntu 16 和 18 上的 python 升級到最新 3.8 版,本文通過實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Python字符串對齊方法使用(ljust()、rjust()和center())
這篇文章主要介紹了Python字符串對齊方法使用(ljust()、rjust()和center()),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04