>> ob ={ 'x' : 1 , 'y' : 2 , 'z' : 3 } >>> x = ob [ 'x' ] >>> ob [ 'y' ]= y 但我們來看看它的內(nèi)存消耗: >>> print ( sys . getsizeof ( ob )) 240 這個(gè)數(shù)額看起來好像挺小,但是當(dāng)你想要?jiǎng)?chuàng)造許多這樣的變量時(shí)就積少成多了:" />

吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python減少字典對象內(nèi)存大小的方法

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-03 15:21 ? 次閱讀

程序執(zhí)行過程中,如果RAM中有大量的對象在運(yùn)行,就可能會(huì)出現(xiàn)內(nèi)存問題,特別是在對可用內(nèi)存總量有限的情況下。

下面是一些減少字典對象內(nèi)存大小的方法,這些方法可以顯著減少對象所需的RAM大小。

字典

Python里用字典來表示結(jié)構(gòu)信息是非常方便的:

  1. >>> ob ={'x':1,'y':2,'z':3}

  2. >>> x = ob['x']

  3. >>> ob['y']= y

但我們來看看它的內(nèi)存消耗:

  1. >>>print(sys.getsizeof(ob))

  2. 240

這個(gè)數(shù)額看起來好像挺小,但是當(dāng)你想要?jiǎng)?chuàng)造許多這樣的變量時(shí)就積少成多了:

對象數(shù)目內(nèi)存大小
1 000 000240 Mb
10 000 0002.40 Gb
100 000 00024 Gb

解決方案

用類實(shí)例來代替字典:

  1. classPoint:

  2. def __init__(self, x, y, z):

  3. self.x = x

  4. self.y = y

  5. self.z = z

  6. >>> ob =Point(1,2,3)

  7. >>> x = ob.x

  8. >>> ob.y = y

類實(shí)例各個(gè)部分的內(nèi)存大小:

FieldSize (bytes)
PyGC_Head24
PyObject_HEAD16
weakref8
dict8
TOTAL:56

如果你不是很了解類和實(shí)例,可以看廖雪峰的這篇文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408

這里的__weakref__是對這個(gè)對象的弱引用列表的引用,而__dict__是對類實(shí)例字典的引用,它包含實(shí)例屬性的值。從Python 3.3開始, 類的所有實(shí)例用共享空間存儲(chǔ)字典的keys. 這減少了內(nèi)存中實(shí)例的大小:

  1. >>>print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__))

  2. 56 112

56+112=168 < 240. 因此,大量的類實(shí)例占用的內(nèi)存比普通字典(dict)要少:

實(shí)例數(shù)目大小
1 000 000168 Mb
10 000 0001.68 Gb
100 000 00016.8 Gb

字典占實(shí)例大小的百分比為112/168=67%, 我們還是可以看出,實(shí)例中字典的大小嚴(yán)重影響了RAM中實(shí)例的大小。下面有更好的方法。

帶__slots__的類實(shí)例

通過消除__dict__和weakref__,可以顯著減少RAM中的類實(shí)例的大小。用__slots__是有可能做到的:

  1. classPoint:

  2. __slots__ ='x','y','z'

  3. def __init__(self, x, y, z):

  4. self.x = x

  5. self.y = y

  6. self.z = z

  7. >>> ob =Point(1,2,3)

  8. >>>print(sys.getsizeof(ob))

  9. 64

RAM中的對象明顯變小:

FieldSize (bytes)
PyGC_Head24
PyObject_HEAD16
x8
y8
z8
TOTAL:64

今日重點(diǎn):在類定義中使用__slots__會(huì)顯著減少大量實(shí)例的內(nèi)存占用

實(shí)例數(shù)目大小
1 000 00064 Mb
10 000 000640 Mb
100 000 0006.4 Gb

目前,這是大幅度減少RAM中類實(shí)例的內(nèi)存占用的主要方法。相比于單純用字典,減少了(240-64)/240= 73% 的內(nèi)存占用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3055

    瀏覽量

    74327
  • 字典
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    7724
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    85037
  • 儲(chǔ)存
    +關(guān)注

    關(guān)注

    3

    文章

    201

    瀏覽量

    22439
收藏 人收藏

    評論

    相關(guān)推薦

    請問Nuclei Studio IDE怎么查看程序所用內(nèi)存大小

    Nuclei Studio IDE 怎么查看程序所用內(nèi)存大小?比如使用TI CCS時(shí)可以在如圖中查看內(nèi)存使用情況?
    發(fā)表于 01-10 06:32

    Python元組和字典使用的基本方法

    Python學(xué)習(xí):2、元組、字典使用的基本方法
    發(fā)表于 04-06 15:12

    STM32F103xx系列內(nèi)存大小

    寫在前面:本文章旨在總結(jié)備份、方便以后查詢,由于是個(gè)人總結(jié),如有不對,歡迎指正;另外,內(nèi)容大部分來自網(wǎng)絡(luò)、書籍、和各類手冊,如若侵權(quán)請告知,馬上刪帖致歉。目錄一、內(nèi)存大小二、STM32F103xx
    發(fā)表于 08-19 08:53

    python字典

    ': '張三'}3. 重要方法判斷key是否存在在 Python 2 中的字典對象有一個(gè) has_key 函數(shù),可以用來判斷一個(gè) key 是否在該
    發(fā)表于 02-23 16:54

    HarmonyOS如何獲取系統(tǒng)內(nèi)存大小和可用內(nèi)存

    解決方案Harmony獲取內(nèi)存大小和Android類似的系統(tǒng)。SystemMemoryInfo systemMemoryInfo = new SystemMemoryInfo
    發(fā)表于 03-15 14:46

    python合并字典的 7 種方法

    1、最簡單的原地更新字典對象內(nèi)置了一個(gè) update 方法,用于把另一個(gè)字典更新到自己身上。>>> profile = {"name": "
    發(fā)表于 04-08 15:11

    python中的字典(dict)對象以及其使用方法

    本文通過以英文的形式全面講解了python中的字典(dict)對象以及其使用方法
    發(fā)表于 05-15 10:00 ?1次下載

    電腦內(nèi)存大小怎么查看

    日常辦公或者玩游戲的時(shí)候,都需要確認(rèn)一下電腦內(nèi)存夠不夠運(yùn)行將要辦公的軟件或者將要玩游戲的軟件,問題來了,怎么查看電腦內(nèi)存大小?現(xiàn)在給大家?guī)碓趺床榭措娔X內(nèi)存大小教程。
    發(fā)表于 05-27 10:13 ?3620次閱讀

    Linux:測試進(jìn)程占用的虛擬內(nèi)存大小

    Linux:測試進(jìn)程占用的虛擬內(nèi)存大小
    的頭像 發(fā)表于 06-23 09:23 ?2918次閱讀
    Linux:測試進(jìn)程占用的虛擬<b class='flag-5'>內(nèi)存大小</b>

    python字典是什么

    ,則可以是任意對象 1. 創(chuàng)建字典 創(chuàng)建一個(gè)字典有三種方法 第一種方法 :先使用 dict() 創(chuàng)建空
    的頭像 發(fā)表于 02-23 16:54 ?3523次閱讀

    python實(shí)現(xiàn)合并字典方法

    字典對象內(nèi)置了一個(gè) update 方法,用于把另一個(gè)字典更新到自己身上。
    的頭像 發(fā)表于 04-08 15:11 ?1058次閱讀

    Python序列的字典類型介紹

    字典 介紹 字典是“鍵值對”的無序可變序列,字典中的每個(gè)元素都是一個(gè)“鍵值對”,包含:“鍵對象”和“值對象”。 可以通過“鍵
    的頭像 發(fā)表于 03-08 17:35 ?1358次閱讀
    <b class='flag-5'>Python</b>序列的<b class='flag-5'>字典</b>類型介紹

    Go高性能-兩種內(nèi)存大小為0的數(shù)據(jù)類型

    Go 中的空結(jié)構(gòu)體 struct{}{} 的內(nèi)存大小等于 0,除此之外,還有別的數(shù)據(jù)類型內(nèi)存大小也等于 0 嗎?
    的頭像 發(fā)表于 05-22 17:33 ?743次閱讀

    weblogic設(shè)置jvm內(nèi)存大小

    WebLogic是一種Java EE應(yīng)用服務(wù)器,用于構(gòu)建和部署企業(yè)級Java應(yīng)用程序。在配置WebLogic服務(wù)器時(shí),設(shè)置JVM的內(nèi)存大小非常重要,這可以提高應(yīng)用程序的性能和可靠性。本文將詳細(xì)介紹
    的頭像 發(fā)表于 12-05 14:44 ?3145次閱讀

    eclipse設(shè)置jvm內(nèi)存大小

    內(nèi)存大小,并對其背后的原理進(jìn)行解釋。 JVM(Java虛擬機(jī))是Java程序的運(yùn)行環(huán)境,它負(fù)責(zé)將Java字節(jié)碼翻譯成機(jī)器碼,以便在不同的平臺(tái)上執(zhí)行。JVM使用內(nèi)存來存儲(chǔ)運(yùn)行時(shí)對象和執(zhí)行過程中的臨時(shí)數(shù)據(jù)。如果JVM的
    的頭像 發(fā)表于 12-06 11:43 ?1954次閱讀
    和平区| 大发888鸿博博彩| 棋牌室营业执照| 永利高百家乐官网开户| 大发888宫网| 乐透乐博彩论坛| 百家乐官网游戏机论坛| 百家乐官网是否有路子| 六合彩今天开什么| 百家乐官网娱乐城注册| 欧博娱乐| 大佬百家乐官网的玩法技巧和规则 | 大发888开户注册平台| 澳门赌场着装| 百家乐官网决战推筒子| 网上赌场| 乐天堂娱乐城| 缅甸百家乐官网娱乐场开户注册| 百家乐官网现金游戏注册送彩金| 黄山市| 澳门百家乐游戏玩法| 大发888官方指定| 百家乐官网平台哪个好本站所有数据都是网友推荐及提供 | 百家乐真人百家乐赌博| 澳门百家乐鸿运| 开户娱乐城送20彩金| 大发888怎样存款| 百家乐长龙怎么预判| 百家乐磁力录| 大发888娱乐城备用| 博彩百家乐字谜总汇| 博彩百家乐最新优惠| 时时博百家乐的玩法技巧和规则| 百家乐游戏规范| 百家乐官网有哪几种| 娱乐城百家乐官网论坛| 百家乐官网怎么下注能赢| 百家乐官网二十一点| 巴厘岛百家乐官网的玩法技巧和规则 | 真人百家乐怎么玩| 新宝娱乐|