python內置模塊,pythondis功能_python 使用 Dis 模塊進行代碼性能剖析

 2023-10-06 阅读 29 评论 0

摘要:Python代碼在執行的時候,會被編譯為Python字節碼,再由Python虛擬機執行Python字節碼。有時候就我們執行python文件的時候會生成一個pyc文件,這個pyc文件即用于存儲Python字節碼指令,而這些字節碼是一種類似于匯編指令的中間語言,但是每個字

Python代碼在執行的時候,會被編譯為Python字節碼,再由Python虛擬機執行Python字節碼。有時候就我們執行python文件的時候會生成一個pyc文件,這個pyc文件即用于存儲Python字節碼指令,而這些字節碼是一種類似于匯編指令的中間語言,但是每個字節碼對應的不是機器指令,而是一段C代碼。

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

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

python內置模塊,1.為什么下面第一個函數比第二個函數耗得內存更少?

def test1(a):

if 0 < a and a < 1:

return 1

日常辦公會用到的python模塊?return 0

def test2(a):

if 0 < a < 1:

python 安裝、return 1

return 0

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

import dis

python簡單代碼。def test1(a):

if 0 < a and a < 1:

return 1

return 0

python常用模塊、def test2(a):

if 0 < a < 1:

return 1

return 0

Python代碼?dis.dis(test1)

print('*'*50)

dis.dis(test2)

結果:

python 類、dis結果

Dis的結果其實很容易閱讀:

第一列:對應的源代碼行數。

第二列:對應的內存字節碼的索引位置。

python怎么用?在第一列和第二列之間的 >> 號表示跳轉的目標 第三列:內部機器代碼的操作。

第四列:指令參數。

第五列:實際參數。

兩個函數的dis分析用*號隔開了,大家可以清晰地看到兩個函數之間的語句區別。第二個函數的字節碼索引最大到了30,而第一個函數的字節碼索引最大僅到了22,因此,第一個函數耗得內存比第二個函數少。

python3。而且,在第一列和第二列之間的 >> 號表示跳轉的目標,大家可以看第二個函數第四列的 18,表示其跳轉到了索引為18的指令,也就是ROT_TWO。第二個函數的跳轉也比第一個函數多,這也可能導致其在某種特殊情況下的效率可能會比第一個函數低。

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

while 1:

pass

while True:

pass

可以通過在命令中使用dis進行分析:

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

到了Python3,True變成了關鍵字,就沒有這個問題了:

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

希望以上兩個Dis模塊的使用例子能給大家帶來一點靈感,分析一段Python代碼的深層次性能問題雖然比較費時費力,但是一旦你分析到了深層次的性能原因,將能累積不少深層次的技術上的知識,寫出更漂亮的代碼。

我們的文章到此就結束啦,如果你希望我們今天的Python 教程,請持續關注我們,如果對你有幫助,麻煩在下面點一個贊/在看哦!有任何問題都可以在下方留言區留言,我們都會耐心解答的!

?Python實用寶典 (pythondict.com)

不只是一個寶典

歡迎關注公眾號:Python實用寶典

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/122471.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息