91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

揭秘Python的內置對象

汽車玩家 ? 來源:今日頭條 ? 作者:任性的90后boy ? 2020-01-18 17:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

該方法用于獲取一個對象的字節(jié)大?。╞ytes)

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

這里有個直觀的例子:

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

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

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

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

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

直接上代碼吧,一起來看看幾類基本數據結構的空對象的大?。?/p>

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

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

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

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

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

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

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

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

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

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

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

3、列表不等于列表!

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

那么,靜態(tài)創(chuàng)建的對象是否也有這樣的分配機制呢?它跟動態(tài)擴容比,是否有所區(qū)別呢?

先看看集合與字典:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    關注

    9

    文章

    3211

    瀏覽量

    76382
  • python
    +關注

    關注

    57

    文章

    4877

    瀏覽量

    90075
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    工業(yè)級設計揭秘:迅為RK3576如何保證-40℃到85℃穩(wěn)定運行?

    工業(yè)級設計揭秘:迅為RK3576如何保證-40℃到85℃穩(wěn)定運行?
    的頭像 發(fā)表于 02-28 15:56 ?102次閱讀
    工業(yè)級設計<b class='flag-5'>揭秘</b>:迅為RK3576如何保證-40℃到85℃穩(wěn)定運行?

    沒有專利的opencv-python 版本

    所有 官方發(fā)布的 opencv-python 核心版本(無 contrib 擴展)都無專利風險——專利問題僅存在于 opencv-contrib-python 擴展模塊中的少數算法(如早期 SIFT
    發(fā)表于 12-13 12:37

    Python調用API教程

    兩個不同系統(tǒng)之間的信息交互。在這篇文章中,我們將詳細介紹Python調用API的方法和技巧。 一、用Requests庫發(fā)送HTTP請求 使用Python調用API的第一步是發(fā)送HTTP請求,通常
    的頭像 發(fā)表于 11-03 09:15 ?894次閱讀

    canopen如何通過對象字典控制外設?

    各位大佬好,我在移植canopen的時候碰到一個疑問。比如我修改對象字典2000,子索引為0這個目錄下的值,如何這個對象映射的是某個led燈的亮滅,輸入1為亮,0為滅。 問題就是我發(fā)送報文之后會進入
    發(fā)表于 09-11 06:04

    重磅!智慧水利背后的NTP時間同步服務器揭秘

    重磅!智慧水利背后的NTP時間同步服務器揭秘!
    的頭像 發(fā)表于 09-10 10:41 ?798次閱讀
    重磅!智慧水利背后的NTP時間同步服務器<b class='flag-5'>揭秘</b>!

    termux調試python猜數字游戲

    用termux做一個猜數字游戲 下面是在Termux中創(chuàng)建猜數字游戲的步驟及完整實現方案,結合Python實現(最適配Termux環(huán)境): ? 一、環(huán)境準備(Termux基礎配置) 1.
    發(fā)表于 08-29 17:15

    termux如何搭建python游戲

    termux如何搭建python游戲 Termux搭建Python游戲開發(fā)環(huán)境的完整指南 一、Termux基礎環(huán)境準備 Termux是一款無需root即可在安卓設備上運行的Linux終端
    發(fā)表于 08-29 07:06

    python app不能運行怎么解決?

    ;python_agent[1241]: xmlrpc request method supervisor.stopProcess failed;python_agent[1241]: xmlrpc request method supervisor.stopProces
    發(fā)表于 08-06 06:27

    比亞迪 · 超級e平臺 · 技術方案的全面揭秘 | 第三曲: 30000轉驅動電機 · 12項核心技術揭秘

    比亞迪 · 超級e平臺 · 技術方案的全面揭秘 | 第三曲: 30000轉驅動電機 · 12項核心技術揭秘
    的頭像 發(fā)表于 06-08 07:20 ?2303次閱讀
    比亞迪 · 超級e平臺 · 技術方案的全面<b class='flag-5'>揭秘</b> | 第三曲: 30000轉驅動電機 · 12項核心技術<b class='flag-5'>揭秘</b>

    火力全開,ModbusTCP/RTU轉ethernet ip協(xié)議網關的不同應用大揭秘

    火力全開,ModbusTCP/RTU轉ethernet ip協(xié)議網關的不同應用揭秘
    的頭像 發(fā)表于 05-22 10:22 ?700次閱讀
    火力全開,ModbusTCP/RTU轉ethernet ip協(xié)議網關的不同應用大<b class='flag-5'>揭秘</b>

    python入門圣經-高清電子書(建議下載)

    此資料內容是一本針對所有層次的Python 讀者而作的Python 入門電子書。 全書分兩部分:第一部分介紹用Python 編程所必須了解的基本概念,包括matplotlib、NumPy
    發(fā)表于 04-10 16:53

    十種主流電機拆解全解析:內部結構大揭秘!

    點擊附件查看全文*附件:十種主流電機拆解全解析:內部結構大揭秘!.doc (免責聲明:本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內容?。?
    發(fā)表于 04-01 14:25

    ?如何在虛擬環(huán)境中使用 Python,提升你的開發(fā)體驗~

    RaspberryPiOS預裝了Python,你需要使用其虛擬環(huán)境來安裝包。今天出版的最新一期《TheMagPi》雜志刊登了我們文檔負責人NateContino撰寫的一篇實用教程,幫助你入門
    的頭像 發(fā)表于 03-25 09:34 ?818次閱讀
    ?如何在虛擬環(huán)境中使用 <b class='flag-5'>Python</b>,提升你的開發(fā)體驗~

    零基礎入門:如何在樹莓派上編寫和運行Python程序?

    在這篇文章中,我將為你簡要介紹Python程序是什么、Python程序可以用來做什么,以及如何在RaspberryPi上編寫和運行一個簡單的Python程序。什么是Python程序?
    的頭像 發(fā)表于 03-25 09:27 ?2057次閱讀
    零基礎入門:如何在樹莓派上編寫和運行<b class='flag-5'>Python</b>程序?

    Python在嵌入式系統(tǒng)中的應用場景

    你想把你的職業(yè)生涯提升到一個新的水平?Python在嵌入式系統(tǒng)中正在成為一股不可缺少的新力量。盡管傳統(tǒng)上嵌入式開發(fā)更多地依賴于C和C++語言,Python的優(yōu)勢在于其簡潔的語法、豐富的庫和快速的開發(fā)周期,這使得它在某些嵌入式場景中非常有用,以下是
    的頭像 發(fā)表于 03-19 14:10 ?1507次閱讀