色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    3037

    瀏覽量

    74157
  • python
    +關注

    關注

    56

    文章

    4800

    瀏覽量

    84834
收藏 人收藏

    評論

    相關推薦

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

    電子發燒友網站提供《揭秘共模電感漏感對使用有影響嗎.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 ?2098次閱讀

    Python建模算法與應用

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

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

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

    opencv-python和opencv一樣嗎

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

    python訓練出的模型怎么調用

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

    EMC大揭秘 PCB設計必備指南

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

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

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

    華為云正式發布CodeArts IDE for Python

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

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

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

    揭秘共模電感選擇技巧

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

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

    電子發燒友網站提供《醫療新革命,磁傳感技術應用細分揭秘!.pdf》資料免費下載
    發表于 03-05 14:39 ?4次下載

    python中open函數的用法詳解

    python中open函數的用法詳解 Python中的open()函數用于打開文件。它接受文件名和模式作為參數,并返回一個文件對象。文件對象可用于讀取、寫入和管理文件。 open()函
    的頭像 發表于 01-30 15:31 ?2178次閱讀
    主站蜘蛛池模板: 超碰caoporon最新视频| 私密按摩师在线观看 百度网盘| 日韩av国产av欧美天堂社区| 亚洲 日本 欧美 中文字幕| 观赏女性排尿| 无码国产成人午夜在线观看不卡 | 亚洲日本在线不卡二区| 国精产品一区一区三区有限在线 | YELLOW免费观看2019| 漂亮的保姆5电影免费观看完整版中文| av无码在线日本天堂| 九九影院午夜理论片无码| 人妻免费久久久久久久了| 芭乐视频网页版在线观看| 啪啪后入内射日韩| 岛国片在线看| 小sao货ji巴cao死你视频| 国产婷婷综合在线视频中文| 日本乱hd高清videos| 第一次处破女18分钟免费| 午夜在线观看免费完整直播网| 国产人妖一区二区| 亚洲色欲色欲www474ee| 国产三级在线观看免费| 亚洲黄色在线观看| 久久亚洲精品中文字幕| aaaaaaa一级毛片| 忘忧草在线社区WWW日本直播| 花蝴蝶在线高清视频观看免费播放| 特级毛片内射WWW无码| 菠萝视频高清版在线观看| 日韩欧美中文字幕在线二视频| 国产午夜亚洲精品理论片八戒| 伊人香蕉在线播放视频免费| 国产在线午夜| 午夜想想爱午夜剧场| 国产AV视频一区二区蜜桃| 亚洲免费每日在线观看| 免费特黄一区二区三区视频一| 丰满的寡妇hd高清在线观看| 日韩高清一区二区三区不卡|