python常量折疊基礎(chǔ)知識點講解
1、概念
所謂常量折疊,指的是在編譯時就查找并計算常量表達式,而不是在運行時再對其進行計算,從而會使運行時更加精簡和快速。
2、實例
在 Python 中,我們可以使用反匯編模塊(Disassembler)獲取 CPython 字節(jié)碼,從而更好地了解代碼執(zhí)行的過程。
當使用dis模塊反匯編上述常量表達式時,我們會得到以下字節(jié)碼:
>>> import dis
>>> dis.dis("day_sec = 24 * 60 * 60")
0 LOAD_CONST 0 (86400)
2 STORE_NAME 0 (day_sec)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
從字節(jié)碼中可以看出,它只有一個LOAD_CONST ,以及一個已經(jīng)計算好的值86400。
這表明 CPython 解釋器在解析和構(gòu)建抽象語法樹期間,會折疊常量表達式 24 * 60 * 60,并將其替換為計算值 86400。
知識點擴展:
常量折疊的外部細節(jié)
當初,咱們將重點轉(zhuǎn)移到外部的實現(xiàn)細節(jié),即關(guān)注 CPython 在哪里以及如何實現(xiàn)常量折疊。
所有的 AST 優(yōu)化(包含常量折疊)都能夠在 ast_opt.c 文件中找到。根本的開始函數(shù)是 astfold_expr,它會折疊 Python 源碼中蘊含的所有表達式。
這個函數(shù)以遞歸形式遍歷 AST,并試著折疊每個常量表達式,如上面的代碼片段所示:
astfold_expr 在折疊某個表達式之前,會嘗試折疊其子表達式(操作對象),而后將折疊操作代理給特定的表達式折疊函數(shù)。
特定操作的折疊函數(shù)對表達式求值,并返回計算后的常數(shù),而后將其放入 AST 中。
例如,每當 astfold_expr 遇到二值運算時,它便調(diào)用 fold_binop,遞歸地計算兩個子操作對象(表達式) 。
fold_binop 函數(shù)返回計算后的常量值,如上面的代碼片段所示:
fold_binop 函數(shù)通過查看以后運算符的品種,而后調(diào)用其相應(yīng)的處理函數(shù)來折疊二值運算。例如,如果以后的操作是加法運算,為了計算最終值,它會對其左側(cè)和右側(cè)操作數(shù)調(diào)用 PyNumber_Add。
到此這篇關(guān)于python常量折疊基礎(chǔ)知識點講解的文章就介紹到這了,更多相關(guān)python常量折疊是什么內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python matplotlib imshow熱圖坐標替換/映射實例
這篇文章主要介紹了python matplotlib imshow熱圖坐標替換/映射實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python中staticmethod和classmethod的作用與區(qū)別
今天小編就為大家分享一篇關(guān)于Python中staticmethod和classmethod的作用與區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
最詳細的python工具Anaconda+Pycharm安裝教程
這篇文章主要介紹了最詳細的python工具Anaconda+Pycharm安裝教程,文中有非常詳細的圖文示例,對不會安裝的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
python實現(xiàn)飛機大戰(zhàn)(面向過程)
這篇文章主要為大家詳細介紹了python面向過程實現(xiàn)飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
python執(zhí)行js腳本報錯CryptoJS is not defined問題
這篇文章主要介紹了python執(zhí)行js腳本報錯CryptoJS is not defined問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Python實現(xiàn)滑動平均(Moving Average)的例子
今天小編就為大家分享一篇Python實現(xiàn)滑動平均(Moving Average)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法
今天小編就為大家分享一篇Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

