python常量折疊基礎知識點講解
1、概念
所謂常量折疊,指的是在編譯時就查找並計算常量表達式,而不是在運行時再對其進行計算,從而會使運行時更加精簡和快速。
2、實例
在 Python 中,我們可以使用反匯編模塊(Disassembler)獲取 CPython 字節碼,從而更好地瞭解代碼執行的過程。
當使用dis模塊反匯編上述常量表達式時,我們會得到以下字節碼:
>>> 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
從字節碼中可以看出,它隻有一個LOAD_CONST ,以及一個已經計算好的值86400。
這表明 CPython 解釋器在解析和構建抽象語法樹期間,會折疊常量表達式 24 * 60 * 60,並將其替換為計算值 86400。
知識點擴展:
常量折疊的外部細節
當初,咱們將重點轉移到外部的實現細節,即關註 CPython 在哪裡以及如何實現常量折疊。
所有的 AST 優化(包含常量折疊)都能夠在 ast_opt.c 文件中找到。根本的開始函數是 astfold_expr,它會折疊 Python 源碼中蘊含的所有表達式。
這個函數以遞歸形式遍歷 AST,並試著折疊每個常量表達式,如上面的代碼片段所示:
astfold_expr 在折疊某個表達式之前,會嘗試折疊其子表達式(操作對象),而後將折疊操作代理給特定的表達式折疊函數。
特定操作的折疊函數對表達式求值,並返回計算後的常數,而後將其放入 AST 中。
例如,每當 astfold_expr 遇到二值運算時,它便調用 fold_binop,遞歸地計算兩個子操作對象(表達式) 。
fold_binop 函數返回計算後的常量值,如上面的代碼片段所示:
fold_binop 函數通過查看以後運算符的品種,而後調用其相應的處理函數來折疊二值運算。例如,如果以後的操作是加法運算,為瞭計算最終值,它會對其左側和右側操作數調用 PyNumber_Add。
到此這篇關於python常量折疊基礎知識點講解的文章就介紹到這瞭,更多相關python常量折疊是什麼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python 深入瞭解GIL鎖詳細
- 用瞭小米MIX FOLD一個月之後,我已經離不開這塊屏幕瞭
- Python編程中Python與GIL互斥鎖關系作用分析
- 如何讓python程序正確高效地並發
- Python Ast抽象語法樹的介紹及應用詳解