python常量折疊基礎(chǔ)知識(shí)點(diǎn)講解
1、概念
所謂常量折疊,指的是在編譯時(shí)就查找并計(jì)算常量表達(dá)式,而不是在運(yùn)行時(shí)再對(duì)其進(jìn)行計(jì)算,從而會(huì)使運(yùn)行時(shí)更加精簡(jiǎn)和快速。
2、實(shí)例
在 Python 中,我們可以使用反匯編模塊(Disassembler)獲取 CPython 字節(jié)碼,從而更好地了解代碼執(zhí)行的過程。
當(dāng)使用dis模塊反匯編上述常量表達(dá)式時(shí),我們會(huì)得到以下字節(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é)碼中可以看出,它只有一個(gè)LOAD_CONST ,以及一個(gè)已經(jīng)計(jì)算好的值86400。
這表明 CPython 解釋器在解析和構(gòu)建抽象語法樹期間,會(huì)折疊常量表達(dá)式 24 * 60 * 60,并將其替換為計(jì)算值 86400。
知識(shí)點(diǎn)擴(kuò)展:
常量折疊的外部細(xì)節(jié)
當(dāng)初,咱們將重點(diǎn)轉(zhuǎn)移到外部的實(shí)現(xiàn)細(xì)節(jié),即關(guān)注 CPython 在哪里以及如何實(shí)現(xiàn)常量折疊。
所有的 AST 優(yōu)化(包含常量折疊)都能夠在 ast_opt.c 文件中找到。根本的開始函數(shù)是 astfold_expr,它會(huì)折疊 Python 源碼中蘊(yùn)含的所有表達(dá)式。
這個(gè)函數(shù)以遞歸形式遍歷 AST,并試著折疊每個(gè)常量表達(dá)式,如上面的代碼片段所示:
astfold_expr 在折疊某個(gè)表達(dá)式之前,會(huì)嘗試折疊其子表達(dá)式(操作對(duì)象),而后將折疊操作代理給特定的表達(dá)式折疊函數(shù)。
特定操作的折疊函數(shù)對(duì)表達(dá)式求值,并返回計(jì)算后的常數(shù),而后將其放入 AST 中。
例如,每當(dāng) astfold_expr 遇到二值運(yùn)算時(shí),它便調(diào)用 fold_binop,遞歸地計(jì)算兩個(gè)子操作對(duì)象(表達(dá)式) 。
fold_binop 函數(shù)返回計(jì)算后的常量值,如上面的代碼片段所示:
fold_binop 函數(shù)通過查看以后運(yùn)算符的品種,而后調(diào)用其相應(yīng)的處理函數(shù)來折疊二值運(yùn)算。例如,如果以后的操作是加法運(yùn)算,為了計(jì)算最終值,它會(huì)對(duì)其左側(cè)和右側(cè)操作數(shù)調(diào)用 PyNumber_Add。
到此這篇關(guān)于python常量折疊基礎(chǔ)知識(shí)點(diǎn)講解的文章就介紹到這了,更多相關(guān)python常量折疊是什么內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python list元素為tuple時(shí)的排序方法
下面小編就為大家分享一篇python list元素為tuple時(shí)的排序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04Django csrf 驗(yàn)證問題的實(shí)現(xiàn)
csrf是通過偽裝來自受信任用戶的請(qǐng)求來利用受信任的網(wǎng)站。這篇文章主要介紹了Django csrf 驗(yàn)證問題的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10基于Python實(shí)現(xiàn)在線二維碼生成工具
這篇文章將為大家展示如何通過純Python編程的方式,開發(fā)出一個(gè)網(wǎng)頁應(yīng)用—基于輸入的網(wǎng)址等文字內(nèi)容實(shí)現(xiàn)二維碼的生成,感興趣的可以學(xué)習(xí)一下2022-05-05Python?多線程知識(shí)點(diǎn)總結(jié)及實(shí)例用法
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于Python?多線程知識(shí)點(diǎn)總結(jié)及實(shí)例用法,對(duì)想好學(xué)習(xí)PY的用戶非常友好,需要的參考下吧。2021-12-12