佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > python 中sys.getsizeof的用法說明

python 中sys.getsizeof的用法說明

熱門標(biāo)簽:百度AI接口 企業(yè)做大做強 Win7旗艦版 客戶服務(wù) 語音系統(tǒng) 電話運營中心 硅谷的囚徒呼叫中心 呼叫中心市場需求

科班出身的碼畜一直被灌輸一條上帝圣經(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倍大小!

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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Python getsizeof()和getsize()區(qū)分詳解
  • python—sys模塊之獲取參數(shù)的操作
  • 解決python中os.system調(diào)用exe文件的問題
  • 使用Python對Syslog信息進(jìn)行分析并繪圖的實現(xiàn)
  • python中sys模塊的介紹與實例
  • python sys.stdin和sys.stdout的用法說明

標(biāo)簽:山西 山西 喀什 安康 崇左 海南 長沙 濟(jì)南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python 中sys.getsizeof的用法說明》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    南昌市| 德安县| 饶平县| 张掖市| 鲁甸县| 青河县| 永德县| 长春市| 公主岭市| 逊克县| 舒兰市| 屯门区| 连州市| 永年县| 红安县| 汾阳市| 许昌市| 祥云县| 抚远县| 那坡县| 澄江县| 土默特右旗| 屏边| 怀仁县| 凌海市| 平度市| 新邵县| 昭通市| 天峨县| 义马市| 馆陶县| 和田县| 巴塘县| 政和县| 扎鲁特旗| 威信县| 新田县| 赤城县| 浦县| 嘉峪关市| 于都县|