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