Python官方在10月7日正式發布3.13.0版本,為開發者們帶來更加強大的Python功能和特性。Python3.13擁有更好的交互式解釋器美,刪除了許多在3.11版本之前被棄用的函數,優化了編譯運行性能,大幅提供語言效率,新增和改進了許多模塊。感興趣的朋友快來下載最新版的Python 3.13體驗吧。
Python安裝步驟
1、下載安裝程序并打開,點擊自定義安裝(Customize installation)
2、勾選如圖所示的選項,點擊next
3、勾選如圖所示的選項,點擊install
4、等待安裝
5、安裝完成
發布重點
錯誤消息繼續得到改進,回溯信息現在默認使用彩色高亮顯示。 locals() 內置函數現在對于修改所返回的映射具有 更細化的語法,并且類型形參現在支持設置默認值。
針對標準庫的改變包括移除已棄用的 API 和模塊,以及用戶友好度和正確性方面的常規提升。 一些舊式標準庫模塊自 Python 3.11 起被棄用 (PEP 594) 之后現在 已被移除。
本文并不試圖提供所有新特性的完整規范說明,而是提供一個方便的概覽。 要了解完整細節請參閱相應文檔,如 標準庫參數 和 語言參考。 要了解某項改變的完整實現和設計理念,請參閱相應新特性的 PEP;但請注意一旦某項特性已完全實現則相應 PEP 通常不會再繼續更新。 請參閱 遷移到 Python 3.13 了解如何從較早 Python 進行升級的指導。
解釋器的改進:
大幅改進的 交互式解釋器 和 改進的錯誤消息。
PEP 667: 現在 locals() 內置函數在修改被返回的映射時具有 已定義語義。 Python 調試器及類似的工具現在即使在并發代碼執行期間也能更可靠地在已優化的作用域中更新局部變量。
PEP 703: CPython 3.13 具有對在運行時禁用 global interpreter lock 的實驗性支持。 請參閱 自由線程 CPython 了解詳情。
PEP 744: 增加了一個基本的 JIT 編譯器。 目前默認是禁用的(但以后可能啟用)。 能夠小幅提升性能 -- 我們預計在接下來的幾個發布版中不斷改進它。
在新的 交互式解釋器 中,以及 回溯信息 和 文檔測試 輸出中的顏色支持。 這可以通過 PYTHON_COLORS and NO_COLOR 環境變量來禁用。
對 Python 數據模型的改進:
__static_attributes__ 保存了可在一個類體的任何函數中通過 self.X 來訪問的屬性名稱。
__firstlineno__ 記錄了一個類定義的首行的行號。
標準庫中的重大改進:
新增了 PythonFinalizationError 異常,當操作在 最終化 期間被阻塞時將被引發。
現在 argparse 模塊可支持棄用命令行選項、位置參數和子命令。
新增的函數 base64.z85encode() 和 base64.z85decode() 支持對 Z85 數據 進行編碼和解碼。
現在 copy 模塊有一個 copy.replace() 函數,支持許多內置類型和任何定義了 __replace__() 方法的類。
新的 dbm.sqlite3 模塊現在是默認的 dbm 后端。
os 模塊增加了 一套新函數 用于處理 Linux 的定時器通知文件描述符。
現在 random 模塊提供了一個 命令行界面。
安全改進:
ssl.create_default_context() 設置了 ssl.VERIFY_X509_PARTIAL_CHAIN 和 ssl.VERIFY_X509_STRICT 作為默認的旗標。
C API 的改進:
現在 Py_mod_gil 槽位被用來指明一個擴展模塊支持在禁用 GIL 的情況下運行。
增加了 PyTime C API,提供了對系統時鐘的訪問。
PyMutex 是新增的輕量級互斥鎖,只占用一個字節。
新增了 一套函數 用于在 C API 中生成 PEP 669 監控事件。
新的類型標注特性:
PEP 696: 類型形參 (typing.TypeVar, typing.ParamSpec 和 typing.TypeVarTuple) 現在可支持默認值。
PEP 702: 新的 warnings.deprecated() 裝飾器在類型系統和運行時中增加了對標記為棄用的支持。
PEP 705: typing.ReadOnly 可被用來將 typing.TypedDict 的項標記為對類型檢查器只讀。
PEP 742: typing.TypeIs 提供了更直觀的類型細化行為,作為對 typing.TypeGuard 的替代。
平臺支持:
PEP 730: 現在 Apple 的 iOS 是 官方支持的平臺,處于 第 3 層級。
PEP 738: 現在 Android 是 官方支持的平臺,處于 第 3 層級。
現在 wasm32-wasi 作為 第 2 層級 的平臺受到支持。
wasm32-emscripten 不再是受到官方支持的平臺。
重要的移除:
PEP 594: 剩余的 19 個“死電池”(老舊 stdlib 模塊)已從標準庫中移除: aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu 和 xdrlib。
移除了 2to3 工具和 lib2to3 模塊(在 Python 3.11 中已被棄用)。
移除了 tkinter.tix 模塊(在 Python 3.6 中已被棄用)。
移除了 locale.resetlocale() 函數。
移除了 typing.io 和 typing.re 命名空間。
移除了鏈式的 classmethod 描述器。
發布計劃的變化:
PEP 602 ("Annual Release Cycle for Python") 已被更新為將新發布版的完整支持 ('bugfix') 期擴展至兩年。 這個更新的政策意味著:
Python 3.9--3.12 有一年半的完整支持,另加三年半的安全修正。
Python 3.13 及以后的版本有兩年的完整支持,另加三年的安全修正。
新的特性
更好的交互式解釋器
Python 現在默認會使用新的 interactive shell,它基于來自 PyPy 項目 的代碼。 當使用從交互式終端啟動 REPL 時,下列新特性將受到支持:
多行編輯并保留歷史記錄。
對 REPL 專屬的命令如 help, exit 和 quit 的直接支持,無需以函數形式調用它們。
提示和回溯 默認啟用彩色顯示。
使用 F1 瀏覽交互式幫助并帶有單獨的命令歷史。
使用 F2 瀏覽去除了輸出以及 >>> 和 ... 提示符的歷史。
使用 F3 進入“粘貼模式”以更方便地粘貼大段代碼(再次按 F3 返回常規提示符)。
要禁用新的交互式 shell,可設置 PYTHON_BASIC_REPL 環境變量。 有關交互模式的詳情,請參見 交互模式。
(由 Pablo Galindo Salgado, ?ukasz Langa 和 Lysandros Nikolaou 在 gh-111201 基于來自 PyPy 項目的代碼貢獻。 Windows 支持由 Dino Viehland 和 Anthony Shaw 貢獻。)
自由線程的 CPython
現在 CPython 具有對運行于禁用 global interpreter lock (GIL) 的自由線程模式的實驗性支持。 這是一個實驗性的特性因而默認是不啟用的。 自由線程模式需要一個不同的可執行程序,通常名為 python3.13t 或 python3.13t.exe。 標記為 free-threaded 的預構建二進制文件可作為官方 Windows 和 macOS 安裝器的一部分被安裝,或者可以附帶 --disable-gil 選項使用源代碼來構建 CPython。
自由線程模式的執行允許在可用的 CPU 核心上并行地運行線程從而充分利用可用的處理能力。 雖然并非所有軟件都能自動從中受益,但在設計時將線程納入考慮的程序在多核心硬件上運行速度會更快。 自由線程模式是實驗性的 并且處于不斷改進的過程中:預計會出現一些程序錯誤并且在單線程場景下出現明顯的性能損失。 可以選擇使用環境變量 PYTHON_GIL 或命令行選項 -X gil=1 讓 CPython 的自由線程構建版支持在運行時啟用 GIL。
為了檢查當前解釋器是否支持自由線程,python -VV 和 sys.version 將包含 "experimental free-theading build" 字樣。 可以使用新增的 sys._is_gil_enabled() 函數來檢查正在運行的線程是否確實禁用了 GIL。
C-API 擴展模塊需要針對自由線程構建版專門進行構建。 支持在禁用 GIL 的情況下運行的擴展應當使用 Py_mod_gil 槽位。 使用單階段初始化的擴展應當使用 PyUnstable_Module_SetGIL() 來指明它們是支支持在禁用 GIL 的情況下運行。 導入不使用這些機制的 C 擴展將導致 GIL 被啟用,除非通過 PYTHON_GIL 環境變量或 -X gil=0 選項顯式地禁用 GIL。 需要 pip 24.1 或更新的版本才能在自由線程構建版中安裝帶有 C 擴展的軟件包。
這項工作成為可能要感謝許多個人和組織,包括針對 Python 和第三方項目測試并啟用自由線程支持的龐大的貢獻者社區。 重要的貢獻者包括:Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou 及其他許多人。 有許多貢獻者受雇于 Meta,該公司提供了大量的工程資源來支持此項目。
實驗性的即時 (JIT) 編譯器
當 CPython 使用 --enable-experimental-jit 選項進行配置和構建時,會添加一個即時(JIT)編譯器以加快某些 Python 程序的運行速度。 在 Windows 上,可使用 PCbuild/build.bat --experimental-jit 啟用 JIT 或使用 --experimental-jit-interpreter 啟用第 2 層級解釋器。 構建要求和進一步的支持信息 包含在 Tools/jit/README.md 中。
--enable-experimental-jit 選項接受這些(可選)值,如果不帶可選值地預設 --enable-experimental-jit 則默認為 yes。
no: 禁用整個第 2 層級和 JIT 管線。
yes: 啟用 JIT。 要在運行時禁用 JIT,則傳入環境變量 PYTHON_JIT=0。
yes-off: 構建 JIT 但默認禁用它。 要在運行時啟用 JIT,則傳入環境變量 PYTHON_JIT=1。
interpreter: 啟用第 2 層級解釋器但是禁用 JIT。 可以在運行時傳入 PYTHON_JIT=0 來禁用該解釋器。
其內部架構大致如下:
我們將從特化的 第 1 層級字節碼 開始。 請參閱 3.11 有什么新變化 了解詳情。
當第 1 層級字節碼達到足夠熱度,它將被翻譯為新的純內部的中間表示形式 (IR),稱為 第 2 層級 IR,有時也稱為微操作碼 ("uops")。
第 2 層級 IR 使用與第 1 層級相同的基于棧的虛擬機,但其指令格式更適合被翻譯為機器碼。
在第 2 層級 IR 被解釋或翻譯為機器碼之前,我們會預先應用一些優化通路。
雖然第 2 層級解釋器存在,但它主要用于對優化管線的先前階段進行調試。可通過為 Python 配置 --enable-experimental-jit=interpreter 選項啟用第 2 層級解釋器。
啟用 JIT 時,經優化的第 2 層級 IR 將被翻譯為機器碼后再執行。
這個機器碼翻譯過程使用了名為 拷貝并打補丁 的技巧。 它沒有運行時依賴,但增加了構建時對 LLVM 的依賴。
針對 locals() 的已定義修改語義
在歷史上,改變 locals() 的返回值的預期結果是留給具體的 Python 實現來定義的。 從 Python 3.13 開始,PEP 667 標準化了 CPython 對于大多數代碼執行作用域的歷史行為,但也將 已優化作用域 (函數、生成器、協程、推導式和生成器表達式) 修改為顯式地返回當前已賦值的局部變量的獨立快照,包括局部引用的在閉包中捕獲的非局部變量。
在已優化作用域中對 locals() 語義的這項修改也會影響隱式地以 locals() 為目標的代碼執行函數的默認行為,如果沒有提供顯式命名空間的話(例如 exec() 和 eval() 等)。 在之前的版本中,在調用代碼執行函數后是否可以通過調用 locals() 訪問更改情況取決于具體的實現。 具體到 CPython 而言,此類代碼通常會按預期工作,但有時可能會在基于其他代碼(包括調試器和代碼執行跟蹤工具)的已優化作用域中失敗,因為代碼有可能重置該作用域中的共享快照。 現在,代碼在已優化作用域中將始終針對局部變量的獨立快照運行,因為在后續調用 locals() 時將永遠看不到更改。 要訪問在這些情況下所做的更改,現在必須將一個顯式命名空間引用傳遞給相關的函數。 或者,也可以更新受影響的代碼以使用更高層級的代碼執行 API 返回結果代碼命名空間(例如,當執行磁盤上的 Python 文件時使用 runpy.run_path() 函數)。
為確保調試器和類似工具能可靠地更新受到此變化影響的作用域中的局部變量,現在 FrameType.f_locals 將返回一個針對此種作用域中的幀的局部變量和在局部引用的非局部變量的直通寫入代理對象,而不是返回一個非持續更新的具有規定義的運行時語義的共享 dict 實例。
性能優化
一些標準庫模塊的導入時間得到了顯著改善。 例如,typing 模塊的導入時間通過移除對 re 和 contextlib 的依賴而減少了大約三分之一。 其他獲得導入時間加速的模塊包括 email.utils, enum, functools, importlib.metadata 和 threading。 (由 Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas 等人在 gh-109653 中貢獻。)
現在對于大量輸入 textwrap.indent() 相比之前可提速大約 30%。 (由 Inada Naoki 在 gh-107369 中貢獻。)
現在 subprocess 模塊會在更多場合下使用 posix_spawn() 函數,包括在許多現代系統平臺上當 close_fds 為 True (默認值) 的時候。 當在 FreeBSD 和 Solaris 上啟動進程時這應該能提供顯著的性能提升。 請參閱上面的 subprocess 小節了解詳情。 (由 Jakub Kulik 在 gh-113117 中貢獻。)
上一篇:Pixso(UI設計工具)
下一篇:Typora專業版