那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

揭秘Python的內置對象

汽車玩家 ? 來源:今日頭條 ? 作者:任性的90后boy ? 2020-01-18 17:30 ? 次閱讀

Python 中的sys模塊極為基礎而重要,它主要提供了一些給解釋器使用(或由它維護)的變量,以及一些與解釋器強交互的函數。

本文將會頻繁地使用該模塊的getsizeof()方法,因此,我先簡要介紹一下:

該方法用于獲取一個對象的字節大小(bytes)

它只計算直接占用的內存,而不計算對象內所引用對象的內存

這里有個直觀的例子:

上例說明了一件事:一個靜態創建的列表,如果只包含兩個元素,那它自身占用的內存就是 80 字節,不管其元素所指向的對象是什么。

好了,擁有這把測量工具,我們就來探究一下 Python 的內置對象都藏了哪些小秘密吧。

1、空對象不是“空”的!

對于我們熟知的一些空對象,例如空字符串、空列表、空字典等等,不知道大家是否曾好奇過,是否曾思考過這些問題:

空的對象是不是不占用內存呢?如果占內存,那占用多少呢?為什么是這樣分配的呢?

直接上代碼吧,一起來看看幾類基本數據結構的空對象的大小:

可見,雖然都是空對象,但是這些對象在內存分配上并不為“空”,而且分配得還挺大(記住這幾個數字哦,后面會考)。

排一下序:基礎數字<空元組 < 空字符串 < 空列表 < 空集合 < 空字典。

這個小秘密該怎么解釋呢?

因為這些空對象都是容器,我們可以抽象地理解:它們的一部分內存用于創建容器的骨架、記錄容器的信息(如引用計數、使用量信息等等)、還有一部分內存則是預分配的。

2、內存擴充不是均勻的!

空對象并不為空,一部分原因是 Python 解釋器為它們預分配了一些初始空間。在不超出初始內存的情況下,每次新增元素,就使用已有內存,因而避免了再去申請新的內存。

那么,如果初始內存被分配完之后,新的內存是怎么分配的呢?

分別給三類可變對象添加 26 個元素,看看結果如何:

由此能看出可變對象在擴充時的秘密:

超額分配機制:申請新內存時并不是按需分配的,而是多分配一些,因此當再添加少量元素時,不需要馬上去申請新內存

非均勻分配機制:三類對象申請新內存的頻率是不同的,而同一類對象每次超額分配的內存并不是均勻的,而是逐漸擴大的

3、列表不等于列表!

以上的可變對象在擴充時,有相似的分配機制,在動態擴容時可明顯看出效果。

那么,靜態創建的對象是否也有這樣的分配機制呢?它跟動態擴容比,是否有所區別呢?

先看看集合與字典:

看到這個結果,再對比上一節的截圖,可以看出:在元素個數相等時,靜態創建的集合/字典所占的內存跟動態擴容時完全一樣。

這個結論是否適用于列表對象呢?一起看看:

上一節的截圖顯示,列表在前 4 個元素時都占 96 字節,在 5 個元素時占 128 字節,與這里明顯矛盾。

所以,這個秘密昭然若揭:在元素個數相等時,靜態創建的列表所占的內存有可能小于動態擴容時的內存!

也就是說,這兩種列表看似相同,實際卻不同!列表不等于列表!

4、消減元素并不會釋放內存!

前面提到了,擴充可變對象時,可能會申請新的內存。

那么,如果反過來縮減可變對象,減掉一些元素后,新申請的內存是否會自動回收掉呢?

如代碼所示,列表在一擴一縮后,雖然回到了原樣,但是所占用的內存空間可沒有自動釋放啊。其它的可變對象同理。

這就是 Python 的小秘密了,“胖子無法減重原理”:瘦子變胖容易,縮減身型也容易,但是體重減不掉,哈哈~~~

5、空字典不等于空字典!

使用 pop() 方法,只會縮減可變對象中的元素,但并不會釋放已申請的內存空間。

還有個 clear() 方法,它會清空可變對象的所有元素,讓我們試試看吧:

調用 clear() 方法,我們就獲得了幾個空對象。

在第一小節里,它們的內存大小已經被查驗過了。(前面說過會考的,請默寫回看下)

但是,如果這時再查驗的話,你會驚訝地發現,這些空對象的大小跟前面查的并不完全一樣!

空列表與空元組的大小不變,然而空字典(72)竟然比前面的空字典(240)要小很多!

也就是說,列表與元組在清空元素后,回到起點不變初心,然而,字典這家伙卻是“賠了夫人又折兵”,不僅把“吃”進去的全吐出來了,還把自己的老本給虧掉了!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74337
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85041
收藏 人收藏

    評論

    相關推薦

    揭秘共模電感漏感對使用有影響嗎

    電子發燒友網站提供《揭秘共模電感漏感對使用有影響嗎.docx》資料免費下載
    發表于 09-30 14:45 ?1次下載

    LDO噪聲揭秘

    電子發燒友網站提供《LDO噪聲揭秘.pdf》資料免費下載
    發表于 09-21 09:13 ?0次下載
    LDO噪聲<b class='flag-5'>揭秘</b>

    DM368 NAND Flash啟動揭秘

    電子發燒友網站提供《DM368 NAND Flash啟動揭秘.pdf》資料免費下載
    發表于 08-27 09:22 ?0次下載
    DM368 NAND Flash啟動<b class='flag-5'>揭秘</b>

    pytorch和python的關系是什么

    在當今的人工智能領域,Python已經成為了最受歡迎的編程語言之一。Python的易學易用、豐富的庫和框架以及強大的社區支持,使其成為了數據科學、機器學習和深度學習等領域的首選語言。而在深度學習領域
    的頭像 發表于 08-01 15:27 ?2359次閱讀

    Python建模算法與應用

    Python作為一種功能強大、免費、開源且面向對象的編程語言,在科學計算、數學建模、數據分析等領域展現出了卓越的性能。其簡潔的語法、對動態輸入的支持以及解釋性語言的本質,使得Python在多個平臺
    的頭像 發表于 07-24 10:41 ?663次閱讀

    揭秘中國汽車芯片市場:主要企業有哪些?

    揭秘中國汽車芯片市場:主要企業有哪些?
    的頭像 發表于 07-19 10:12 ?652次閱讀
    <b class='flag-5'>揭秘</b>中國汽車芯片市場:主要企業有哪些?

    opencv-python和opencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發表于 07-16 10:38 ?1405次閱讀

    python訓練出的模型怎么調用

    使用pickle模塊 pickle 是Python的一個內置模塊,用于序列化和反序列化Python對象結構。使用 pickle 可以方便地保存和加載模型。 import pickle
    的頭像 發表于 07-11 10:15 ?2273次閱讀

    用pycharm進行python爬蟲的步驟

    以下是使用PyCharm進行Python爬蟲的步驟: 安裝PyCharm和Python 首先,您需要安裝PyCharm和Python。PyCharm是一個流行的Python集成開發環境
    的頭像 發表于 07-11 10:11 ?954次閱讀

    EMC大揭秘 PCB設計必備指南

    EMC大揭秘 PCB設計必備指南
    的頭像 發表于 06-15 16:29 ?3147次閱讀
    EMC大<b class='flag-5'>揭秘</b> PCB設計必備指南

    華為云開發者桌面全新發布 CodeArts IDE for Python,極致優雅云原生開發體驗

    近日,華為云正式發布 CodeArts IDE for Python,這是一款內置華為自研 Python 語言服務,提供智能編程、靈活調試能力的可擴展桌面開發工具,為華為云開發者提供卓越
    的頭像 發表于 05-10 00:27 ?1289次閱讀
    華為云開發者桌面全新發布 CodeArts IDE for <b class='flag-5'>Python</b>,極致優雅云原生開發體驗

    華為云正式發布CodeArts IDE for Python

    近日,華為云正式發布CodeArts IDE for Python,這是一款內置華為自主創新的Python語言服務,提供智能編程、靈活調試能力的可擴展桌面開發工具,為華為云開發者提供卓越Pyt
    的頭像 發表于 05-08 14:58 ?553次閱讀

    如何使用Python生成四位隨機數字

    為了實現這些目標,Python 為我們提供了random() 模塊。random() 是一個內置Python 模塊,用于生成隨機數。
    的頭像 發表于 04-15 12:47 ?778次閱讀

    揭秘共模電感選擇技巧

    電子發燒友網站提供《揭秘共模電感選擇技巧.docx》資料免費下載
    發表于 03-29 14:36 ?0次下載

    醫療新革命,磁傳感技術應用細分揭秘

    電子發燒友網站提供《醫療新革命,磁傳感技術應用細分揭秘!.pdf》資料免費下載
    發表于 03-05 14:39 ?4次下載
    百家乐官网网站新全讯网| 百家乐大眼仔用法| 大发888在线娱乐游戏| 百家乐秘诀| 百家乐最低下注| 全迅网百家乐官网的玩法技巧和规则| 百家乐官网必学技巧| 百家乐官网稳赢玩法| 百家乐官网策略| 百家乐官网2号干扰| 永利博百家乐官网现金网| 玉山县| 青岛市| 家百家乐官网破解软件| 网络百家乐官网路单图| 赌百家乐官网的方法| 百家乐官网技巧发布| 百家乐官网最好的投注方法| 百家乐官网玩法注意事项| 真人百家乐官网蓝盾娱乐网| 百家乐官网侧牌器| 金字塔百家乐官网的玩法技巧和规则| 香港百家乐官网赌城| 传奇百家乐官网的玩法技巧和规则| 香港百家乐官网娱乐场开户注册| 百家乐官网二路珠无敌稳赢打法 | 威尼斯人娱乐城极好| 大发888出纳柜台 2014| 金冠娱乐城 安全吗| 关岭| 百家乐官网最新套路| 百家乐官网庄闲点| 澳门百家乐大小| 女神百家乐的玩法技巧和规则| 大发888缺少 casino| 甘肃省| 广东百家乐官网扫描分析仪| 24山方位 子孙 文昌| 百家乐六合彩3535| 大发888老虎机苹果版| bet365备用|