Python 每年都會發布新版本,上半年是功能鎖定的測試版,年底是最終版本。
Python 3.11 的特性集剛剛定稿,測試版本已經發布,開發人員在非生產代碼上可以嘗試使用這個最新版本,驗證它能否在你的程序中工作,并了解你的程序是否能從本次性能增加中受益。
下面是 Python 3.11 中最重要新特性的概述,以及它們對 Python 開發者的意義。
提速
在 Python 3.11 中,有許多單獨的性能改進,最大的一個新功能是自適應解釋器,由于對象的類型很少更改,解釋器現在嘗試分析正在運行的代碼,并用類型特定的字節碼替換常規字節碼。例如,二進制操作(加法、減法等)可以被替換為整數、浮點和字符串的特殊版本替換。
Python 函數調用在 Python 3.11 中也需要更少的開銷,用于函數調用的堆棧使用的內存更少,而且設計得更有效。此外,雖然遞歸調用沒有尾部優化(在 Python 中是不可能的) ,但它們比以前的版本更有效率,Python 解釋器本身的啟動速度也更快, 運行時所需的核心模塊的存儲和加載效率也更高。
根據官方的 Python 基準測試套件,Python 3.11 運行速度比 3.10 快 1.25 倍。注意,這個速度提升是一個綜合的衡量標準,有些事情要快得多,但許多其他事情只是稍快一點或者大致相同。這些改進是無限制的,你不需要對原 Python 程序進行任何修改,就可以享受 3.11 的速度提升。
增強錯誤信息
Python 3.11 中另一個有用的特性是更詳細的錯誤信息,Python 3.10 已經有了更好的錯誤報告,這要歸功于解釋器中使用新的分析器。現在,Python 3.11 在此基礎上進行了擴展,提供了關于給定表達式的哪個具體部分導致錯誤的詳細反饋。
3.11 中另一個非常有用的特性是更詳細的錯誤消息,由于解釋器中使用了新的解析器,Python 3.10 已經有了更好的錯誤報告。現在,Python 3.11 對此進行了擴展,提供了給定表達式的哪個具體部分導致錯誤的詳細反饋。
考慮以下代碼,它拋出了一個錯誤:
1.x = [1,2,3]
2.z = x[1][0]
在 Python 3.10 中,我們會收到下面的錯誤消息,這并不是很有幫助:
1. File "C:\Python311\code.py", line 2, in <module>
2. z = x[1][0]
TypeError: 'int' object is not subscriptable
Python 3.11 中的錯誤跟蹤直接指向生成錯誤的確切部分,而不是讓我們猜測哪個 int 是不可編寫的腳本。
1.File "C:\Python311\code.py", line 2, in <module>
2. z = x[1][0]
3. ~~~~^^^
4.ypeError: 'int' object is not subscriptable
現在,問題出現在哪里已經沒有歧義了。
改進異常
在 Python 3.11 中,Python 的錯誤處理機制 Exceptions 獲得了許多新特性:
- 通過新的 except * 語法和新的 ExceptionGroup 異常類型,可以一次引發和處理多個異常,例如在處理異步或并發方法時,或者在重試操作時處理多個失敗時,它可以更優雅的處理。
- Zero-cost 異常:異常現在對程序沒有任何成本,除非它們真的被引發,這意味著 try/except 代碼塊會更快,并使用更少的內存。
- 捕獲異常所需的時間減少了 10% 左右。
- 異常可以與本身的文本分開,并通過上下文注釋來豐富。
改進類型
Python 的類型提示功能使更大的代碼庫容易管理和分析,并且自 Python 3.5 以來的每次修訂都有顯著的增長,Python 3.11 帶來了幾個新的類型提示功能。
自我類型
以前,類方法 return self 需要復雜而冗長的注解才能發揮作用, typing.Self 可以簡單的將類方法的返回值注釋為 Self,你可以從分析工具中得到有用和可預測的結果。
任意的字符串字面類型
以前,類型注解無法指示給定的變量必須是字符串字面量(即源代碼中定義的字符串)。新的 typing.LiteralString 注解修復了這個問題,使用新的注解,字面量可以測試變量是在源碼中定義的字符串,還是由源代碼定義的字符串組成的新字符串。
數據類轉換
從 Python 3.7 開始,數據類使定義類更加容易,這些類遵循通用模式,根據它們的初始化參數創建屬性。但沒有標準的機制來允許表現得像數據類(但不是數據類)的內容,使用類型注解來聲明它們的行為,數據類轉換添加裝飾器 typing.Dataclass _ transform 指示給定的函數、類或元類像數據類一樣工作。
可變參數泛型
類型提示的最初提議包括 TypeVar ,它是一種使用單一參數類型來指定泛型函數的方法,例如,類型 T 可以是 int 或 float ,Python 3.11 添加了 TypeVarTuple 或者 “variadic generics” ,你可以使用它來指定占位符,不僅是一種類型,而且是一系列類型,表現形式為元組,在 NumPy 之類的庫中特別有用,在這些庫中,你可以提前執行錯誤檢查,比如判斷輸入數組是否正確。
標準庫中的 TOML 只讀支持
Python 使用 TOML(即 Tom’s Obvious Minimal Language)作為配置格式 (如 pyproject.toml),但沒有將讀取 TOML 格式文件的能力作為一個標準庫模塊公開。Python 3.11 增加了 tomllib 來解決這個問題,注意 tomllib 不能創建或寫入 TOML 文件,因此你需要一個第三方模塊,如 Tomli-W 或 TOML Kit 。
正則表達式的原子組和提速
用于處理正則表達式的 re 模塊,缺少其他正則表達式實現中的一些特性。一種是原子組,在其他語言中得到廣泛支持,Python 3.11 現在使用通用的原子分組語法(例如, (? > ...) )。
re 模塊的模式匹配引擎也進行了一些重寫,運行速度提高了 10% 。
從標準庫中刪除“dead batteries”
PEP 594 啟動了一項工作,從 Python 標準庫中刪除了許多所謂的“dead batteries”,即過時或未維護的模塊,在 Python 3.11 中,這些庫被標記為已棄用但尚未刪除; 它們將在 Python 3.13 中完全刪除。
Python 3.11 其他的新增內容、修正和變化
在 Python 3.11 中還有更多的小改進:
- Python 對象需要更少的內存,因為它們的名稱空間現在是延遲創建的,并且它們的名稱空間字典會盡可能的共享鍵。
- 所有鍵都是 Unicode 的字典,而且不再需要存儲散列,從而減少了字典的大小,并提高了緩存效率。
- CPython 運行時(Python 解釋器),現在已經有了編譯到 WebAssembly 的實驗性支持,這可能有助于像 PyScript 這種項目的未來發展,它允許一個 WASM 編譯的 Python 運行時在瀏覽器中運行。
譯者介紹
王德朕,51CTO社區編輯,10年互聯網產研經驗,6年IT教培行業經驗。原K12教育上市公司產品經理,技術博客專家,藍橋簽約作者,《滾雪球學Python》專欄作者,《爬蟲100例》專欄特約作者,78技術人社區發起者。
原文標題:The best new features and fixes in Python 3.11,作者:Serdar Yegulalp
鏈接:https://www.infoworld.com/article/3660550/the-best-new-features-and-fixes-in-python-311.html