Python 3.13 要來了
項目目標
faster-cpython 項目的目標是提高 Python 解釋器的性能,使其能夠更好地支持大型應用程序和數據科學領域。3.13 的目標是將花在解釋器上的時間減少至少 50%。希望通過以下方式實現這一目標:
使用分層編譯(tiered compilation)技術,根據代碼的執(zhí)行頻率和熱度,動態(tài)地選擇不同級別的優(yōu)化和編譯策略。
使用靜態(tài)分析(static analysis)技術,在運行時之前對代碼進行預處理和優(yōu)化,例如消除冗余操作、推斷類型信息、重排指令順序等。
改進字節(jié)碼指令(bytecode instructions)的定義和生成,使其更清晰、更高效、更易于維護和擴展。
改進內存管理(memory management)機制,減少內存分配和垃圾回收的開銷,提高內存利用率和緩存友好性。
改進對象模型(object model)和類型系統(tǒng)(type system),增加對用戶自定義類型(user-defined types)和擴展類型(extension types)的支持,提高對象操作的靈活性和效率。
改進模塊加載(module loading)和導入(importing)機制,減少啟動時間和內存占用,提高模塊復用性和兼容性。
改進異常處理(exception handling)機制,減少異常拋出和捕獲的開銷,提高異常安全性和可調試性。
改進調試工具(debugging tools)和性能分析工具(performance analysis tools),增加對新特性和優(yōu)化的支持,提高調試和分析的效率和準確性。
項目計劃
根據 Python 語言的發(fā)展周期,每六個月發(fā)布一個新版本,并在每個版本中實現一些優(yōu)化和改進。我們目前正在開發(fā) 3.13 版本,計劃在 2023 年 6 月發(fā)布。以下是在 3.13 版本中將要實現的一些主要特性:
完成分層編譯器(tiered compiler)的設計和實現,包括兩個級別:第一級是基于 PEP 659 的自適應優(yōu)化器(adaptive optimizer),第二級是基于 LLVM 的即時編譯器(just-in-time compiler)。第一級優(yōu)化器負責收集代碼執(zhí)行信息,并根據信息進行一些簡單的優(yōu)化,例如內聯緩存(inline caching)、指令專門化(instruction specialization)、循環(huán)展開(loop unrolling)等。第二級編譯器負責將熱點代碼編譯成機器碼,并進行一些復雜的優(yōu)化,例如常量傳播(constant propagation)、死碼消除(dead code elimination)、寄存器分配(register allocation)等。
完成靜態(tài)分析器(static analyzer)的設計和實現,包括兩個部分:第一部分是基于 AST 的語法分析器(syntax analyzer),第二部分是基于 CFG 的語義分析器(semantic analyzer)。語法分析器負責將源代碼解析成抽象語法樹(abstract syntax tree),并進行一些語法層面的優(yōu)化,例如常量折疊(constant folding)、表達式簡化(expression simplification)、語句重排(statement reordering)等。語義分析器負責將抽象語法樹轉換成控制流圖(control flow graph),并進行一些語義層面的優(yōu)化,例如類型推斷(type inference)、變量壽命分析(variable lifetime analysis)、數據流分析(data flow analysis)等。
完成字節(jié)碼生成器(bytecode generator)的設計和實現,包括兩個部分:第一部分是基于 DSL 的指令定義器(instruction definer),第二部分是基于模板的指令生成器(instruction generator)。指令定義器負責使用自定義的 C-like DSL 來定義字節(jié)碼指令的語義和行為,例如操作數類型、堆棧效果、異常處理、跟蹤和檢測等。指令生成器負責根據指令定義來生成不同級別編譯器所需的代碼,例如主解釋器(main interpreter)、第二級解釋器(tier 2 interpreter)、文檔生成器(documentation generator)、元數據生成器(metadata generator)等。
完成內存管理器(memory manager)的設計和實現,包括兩個部分:第一部分是基于引用計數(reference counting)的內存分配器(memory allocator),第二部分是基于標記 - 清除(mark-sweep)的垃圾回收器(garbage collector)。內存分配器負責為對象分配和釋放內存空間,并維護對象的引用計數。垃圾回收器負責檢測和回收循環(huán)引用(cyclic reference)造成的內存泄漏。我們將對內存管理器進行一些改進,例如使用子代劃分(generational partitioning)、增量掃描(incremental scanning)、弱引用處理(weak reference handling)、池化分配(pooled allocation)等。
完成對象模型和類型系統(tǒng)的設計和實現,包括兩個部分:第一部分是基于 PyObject 的對象表示法(object representation),第二部分是基于 PyTypeObject 的類型表示法(type representation)。對象表示法負責定義對象的內存布局和屬性,例如引用計數、類型指針、值域等。類型表示法負責定義類型的元數據和方法,例如名稱、大小、哈希函數、比較函數、訪問函數等。我們將對對象模型和類型系統(tǒng)進行一些改進,例如使用緊湊布局(compact layout)、動態(tài)調度(dynamic dispatch)、多重繼承(multiple inheritance)、混合類型。
相關鏈接、相關信息來源:
https://github.com/faster-cpython/ideas
https://github.com/faster-cpython/ideas/blob/main/3.12/interpreter_definition.md
https://github.com/faster-cpython/
