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

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

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

Dis模塊的使用

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

Python代碼在執(zhí)行的時(shí)候,會(huì)被編譯為Python字節(jié)碼,再由Python虛擬機(jī)執(zhí)行Python字節(jié)碼。有時(shí)候就我們執(zhí)行python文件的時(shí)候會(huì)生成一個(gè)pyc文件,這個(gè)pyc文件即用于存儲(chǔ)Python字節(jié)碼指令,而這些字節(jié)碼是一種類似于匯編指令的中間語(yǔ)言,但是每個(gè)字節(jié)碼對(duì)應(yīng)的不是機(jī)器指令,而是一段C代碼。

而Dis模塊,就是用于查看這些字節(jié)碼的運(yùn)行軌跡,因此我們可以用Dis模塊判斷兩個(gè)函數(shù)的內(nèi)存占用誰(shuí)會(huì)更大,誰(shuí)會(huì)更消耗CPU性能,不僅如此,通過指令,我們還可以知道Python中一些內(nèi)置函數(shù)、變量的取值過程、運(yùn)行邏輯,對(duì)于我們優(yōu)化代碼很有幫助。

下面將通過兩個(gè)例子,來介紹Dis模塊的使用。

1.為什么下面第一個(gè)函數(shù)比第二個(gè)函數(shù)耗得內(nèi)存更少?

圖片

圖片

一般人是比較難直接看出來的,但是我們使用Dis模塊卻能很容易找到答案:

圖片

結(jié)果:

圖片

Dis的結(jié)果其實(shí)很容易閱讀:

第一列: 對(duì)應(yīng)的源代碼行數(shù)。
第二列: 對(duì)應(yīng)的內(nèi)存字節(jié)碼的索引位置。
在第一列和第二列之間的 >> 號(hào)表示跳轉(zhuǎn)的目標(biāo)
第三列: 內(nèi)部機(jī)器代碼的操作。
第四列: 指令參數(shù)
第五列: 實(shí)際參數(shù)。

兩個(gè)函數(shù)的dis分析用*號(hào)隔開了,大家可以清晰地看到兩個(gè)函數(shù)之間的語(yǔ)句區(qū)別。第二個(gè)函數(shù)的字節(jié)碼索引最大到了30,而第一個(gè)函數(shù)的字節(jié)碼索引最大僅到了22,因此,第一個(gè)函數(shù)耗得內(nèi)存比第二個(gè)函數(shù)少。

而且,在第一列和第二列之間的 >> 號(hào)表示跳轉(zhuǎn)的目標(biāo),大家可以看第二個(gè)函數(shù)第四列的 18,表示其跳轉(zhuǎn)到了索引為18的指令,也就是ROT_TWO。第二個(gè)函數(shù)的跳轉(zhuǎn)也比第一個(gè)函數(shù)多,這也可能導(dǎo)致其在某種特殊情況下的效率可能會(huì)比第一個(gè)函數(shù)低。

2.為什么Python2中,whil****e True 比 while 1慢?

while 1:
    pass

while True:
    pass

可以通過在命令中使用dis進(jìn)行分析:

圖片

可以看到,while 1 在第二行是直接JUMP_ABSOLUTE,因此相比于While True 少了LOAD_NAME 和 POP_JUMP_IF_FALSE。這是因?yàn)門rue在Python2中不是一個(gè)關(guān)鍵字,而是一個(gè)內(nèi)置變量,因此每次Python都會(huì)用LOAD_NAME去檢查(POP_JUMP_IF_FALSE)True的值。這就是為什么While True 比while 1慢的原因。

到了Python3,True變成了關(guān)鍵字,就沒有這個(gè)問題了:

圖片

Python 3 針對(duì) Python 2 做了非常多的替換,這也是為什么它不兼容 Python 2 的原因之一,差別太大了。因此,建議各位初學(xué)者直接上手 Python 3 進(jìn)行學(xué)習(xí),而非 Python 2.

希望以上兩個(gè)Dis模塊的使用例子能給大家?guī)硪稽c(diǎn)靈感,分析一段Python代碼的深層次性能問題雖然比較費(fèi)時(shí)費(fèi)力,但是一旦你分析到了深層次的性能原因,將能累積不少深層次的技術(shù)上的知識(shí),寫出更漂亮的代碼。

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

    關(guān)注

    7

    文章

    2628

    瀏覽量

    47215
  • DIS
    DIS
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    16445
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    897

    瀏覽量

    27969
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84293
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OPA548 DIS是高阻態(tài)還是什么狀態(tài)?

    如圖:支持利用E/S腳的EN/DIS功能, 想知道 1.DIS是高阻態(tài)還是什么狀態(tài), 2.1. 從有輸輸出到輸入DIS電平,到輸出延時(shí)時(shí)間是多少 2.2.從DIS無輸出到輸入EN電
    發(fā)表于 09-02 06:54

    請(qǐng)問OPA695 DIS要怎么接?

    請(qǐng)問OPA695DIS要怎么接?
    發(fā)表于 09-06 07:57

    探究python字節(jié)碼

    玩這個(gè),Python標(biāo)準(zhǔn)庫(kù)中的dis模塊就非常有用了; dis模塊為Python字節(jié)碼提供了一個(gè)“反匯編程序”,從而可以輕松獲取人為可讀的版本并查找各種字節(jié)碼指令。
    發(fā)表于 05-22 15:48

    無法閃現(xiàn)開發(fā)SPC560B-Dis

    大家好,感謝您的時(shí)間和幫助。我正在使用SPC560B-DIS開發(fā)板和spc5studio IDE。突然當(dāng)我試圖閃存開發(fā)板時(shí),我在日志中遇到錯(cuò)誤說:錯(cuò)誤,Core :: PpcJtagTargIntf
    發(fā)表于 01-28 10:36

    DIS仿真系統(tǒng)中的計(jì)算機(jī)生成兵力研究

    在分析DIS 仿真系統(tǒng)框架的基礎(chǔ)上,討論了仿真系統(tǒng)中的進(jìn)攻方CGF 系統(tǒng)的實(shí)體動(dòng)態(tài)模型、自治行為產(chǎn)生和操作員控制,最后說明了仿真系統(tǒng)中的時(shí)空一致性問題。對(duì)研究基于DIS 的計(jì)
    發(fā)表于 03-29 14:37 ?15次下載

    ARM設(shè)計(jì)的DIS采集系統(tǒng)方案

    ARM設(shè)計(jì)的DIS采集系統(tǒng)方案 數(shù)字化信息系統(tǒng)實(shí)驗(yàn)室(Digital Information System,DIS)是新一代的中小學(xué)實(shí)驗(yàn)教學(xué)系統(tǒng),是先進(jìn)的數(shù)字技術(shù)應(yīng)用到
    發(fā)表于 04-28 10:05 ?1333次閱讀
    ARM設(shè)計(jì)的<b class='flag-5'>DIS</b>采集系統(tǒng)方案

    基于ARM的DIS采集系統(tǒng)設(shè)計(jì)

    2006年,教育部將DIS納入了中小學(xué)實(shí)驗(yàn)儀器裝備標(biāo)準(zhǔn),建議有條件的學(xué)校配備。目前,國(guó)內(nèi)已有多家企業(yè)有相應(yīng)的產(chǎn)品,但大多不夠成熟。而國(guó)外的類似產(chǎn)品雖然較為成熟,但價(jià)格偏
    發(fā)表于 07-21 15:46 ?1053次閱讀
    基于ARM的<b class='flag-5'>DIS</b>采集系統(tǒng)設(shè)計(jì)

    LA46 DIS 09911-1_0126聯(lián)想B460 電路圖

    LA46 DIS 09911-1_0126聯(lián)想B460 電路圖
    發(fā)表于 02-14 16:10 ?87次下載

    基于SPC582B-DIS微控制器的參考設(shè)計(jì)

    View the reference design for SPC582B-DIS. http://srfitnesspt.com/soft/ has thousands of reference designs to help bring your project to life.
    發(fā)表于 07-09 16:43 ?2次下載
    基于SPC582B-<b class='flag-5'>DIS</b>微控制器的參考設(shè)計(jì)

    彗星DIS SI1構(gòu)建原理圖下載

    彗星DIS SI1構(gòu)建原理圖下載
    發(fā)表于 07-16 09:58 ?0次下載

    基于SPC560B-DIS微控制器的參考設(shè)計(jì)

    View the reference design for SPC560B-DIS. http://srfitnesspt.com/soft/ has thousands of reference designs to help bring your project to life.
    發(fā)表于 08-31 18:14 ?2次下載
    基于SPC560B-<b class='flag-5'>DIS</b>微控制器的參考設(shè)計(jì)

    基于SPC560D-DIS微控制器的參考設(shè)計(jì)

    View the reference design for SPC560D-DIS. http://srfitnesspt.com/soft/ has thousands of reference designs to help bring your project to life.
    發(fā)表于 08-31 18:16 ?3次下載
    基于SPC560D-<b class='flag-5'>DIS</b>微控制器的參考設(shè)計(jì)

    Dis預(yù)測(cè)意外情況

    ./oschina_soft/dis.zip
    發(fā)表于 06-13 11:31 ?4次下載
    <b class='flag-5'>Dis</b>預(yù)測(cè)意外情況

    ZIWBO0/ZIWB1/ZIWEO DIS M/B示意圖文件

    ZIWBO0/ZIWB1/ZIWEO DIS M/B示意圖文件
    發(fā)表于 04-17 10:52 ?1次下載

    python 使用Dis模塊進(jìn)行代碼性能剖析

    就像一個(gè)黑匣子,很多時(shí)候我們不知道python內(nèi)部是怎樣執(zhí)行代碼的,而且DEBUG的時(shí)候也沒有機(jī)器指令可以查看,非常不利于代碼優(yōu)化。但是沒關(guān)系,現(xiàn)在我們有Dis模塊來對(duì)代碼進(jìn)行性能剖析。 為什么下面
    的頭像 發(fā)表于 11-03 15:39 ?512次閱讀
    python 使用<b class='flag-5'>Dis</b><b class='flag-5'>模塊</b>進(jìn)行代碼性能剖析