Python 3.11 徹底解析|加速化・新功能・導入方法・相容性完整指南

目次

1. Python 3.11 是什麼?【概述與發布背景】

Python 3.11 的登場與備受矚目的背景

Python 3.11 是於 2022 年 10 月 24 日正式發布的 Python 3 系列最新版本之一。此版本與以往的 Python 3.10 相比,大幅著重於效能提升與開發體驗的強化,並加入了眾多改進。 至今 Python 以其易用性與豐富的函式庫群,在 Web 開發、資料分析、AI、自動化等各領域均獲得支持。其中,Python 3.11 以「更快、更明確」為目標,透過執行速度的劇烈提升與型別提示的進一步演進,進化為更精煉的語言規格。

開發的背景與 CPython 團隊的努力

Python 3.11 的開發主要由 CPython(Python 的官方實作)團隊主導,以效能改善為首要目標而推進。特別是 Google 的 Python 開發者 Mark Shannon 氏所領導的「Faster CPython」專案,即為其核心努力。 此專案旨在未來實現「5 倍的速度提升」,而在 3.11 版本中作為第一步,達成了最高 60% 的高速化。這意在將 Python 在執行速度方面提升至能與其他語言匹敵的水平。

Python 3.10 與之的差異:有什麼大幅改變?

Python 3.11 與前一版本 3.10 相比,有以下重大變化。
  • 執行速度的大幅改善(CPython 最佳化)
  • 型別提示的功能強化(Self、TypeVarTuple 等)
  • 新語法導入(例外群組的追加)
  • TOML 檔案的原生支援
Python 3.10 以「語法強化」為特色,但 3.11 則轉向「執行效能」與「開發的便利性」,可說是實務導向的更新。

為什麼現在應該使用 Python 3.11?

Python 3.11 不僅僅是新增了新功能而已,還包含「執行速度的加速化」「型別安全性的提升」等,在實際開發現場中實用的改善點非常豐富。特別是在業務應用程式或 AI 模型等需要執行效能的領域,從舊版本移轉的程度被強烈推薦。 此外,在 Python 社群中,以版本 3.11 為前提的函式庫更新也在推進中,預計將成為今後的標準。

2. 【高速化的核心】Python 3.11 的效能提升

最大 60% 的高速化,其原因為何?

Python 3.11 最大的亮點,無疑是處理速度的提升。根據官方公告,與 Python 3.10 相比,平均提升約 25%,最大可達 60% 的高速化。這是從日常腳本執行到大規模資料處理,廣泛場景中直接影響使用者體驗速度的進化。 這種速度提升不僅限於編譯器的最佳化,還透過對 Python 基礎架構 CPython 本身的內部處理進行改進來達成。

Faster CPython 專案是什麼?

這種高速化的背景,有先前提到的「Faster CPython 專案」的存在。Google 的 Mark Shannon 氏主導,目的是大幅改善 Python 的執行速度,逐步進行最佳化。 在 Python 3.11 中,進行了以下具體改善:
  • 解釋器的指令集檢討 位元組碼的指令被整理・簡化,讓更有效率的執行成為可能。
  • 「Zero-cost exception handling」的實作 例外處理的機制被輕量化,即使使用 try-except 語句,對效能的影響也變小了。
  • 函式呼叫的高速化 Python 函式的呼叫處理被簡化,基於函式的程式碼執行大幅高速化。
  • 高頻率操作的內部快取 屬性存取或比較運算等,頻繁使用的操作被效率化。
這些改善的特點是,無需大幅改寫 Python 程式碼,就能直接使用並變得更快,這對開發者來說極具吸引力。

基準測試比較:Python 3.10 vs 3.11

以下是實際使用 Python 官方提供的「pyperformance」基準測試套件所進行的比較結果範例:
測試內容Python 3.10Python 3.11改善率
檔案讀取1.00 秒0.78 秒約 22% 提升
JSON 解析0.95 秒0.70 秒約 26% 提升
複雜的遞迴處理2.40 秒1.45 秒約 40% 提升
正規表達式的匹配1.20 秒0.85 秒約 29% 提升
※數值會因環境或程式碼而異,但整體上可以看到大幅改善。

對開發現場的影響

Python 常被說「慢」,但隨著 3.11 的登場,執行效能方面的弱點大幅改善。在 Web 應用程式、批次處理、機器學習管線等各種現場,Python 的使用價值更上一層樓。 特別是,無需使用 JIT(Just-In-Time)編譯就能實現這種效能,這對重視穩定性和可攜性的現場來說,是重要的優點。

Python 3.12 以降持續的高速化浪潮

Faster CPython 專案預計將持續到 Python 3.12、3.13 等未來版本。今後將考慮導入更具 JIT 特性的方法,或檢討 GC(垃圾回收)等。 Python 正穩步進化為「不僅易寫,還快的語言」。

3. Python 3.11 的主要新功能總結

新例外群組(ExceptionGroup)的導入

傳統的 Python 中,同時處理多個例外很困難,這是一個挑戰。Python 3.11 為了解決這個問題,引入了 ExceptionGroup 類別和 except* 語法。 這個功能特別在非同步處理或並行處理中,當多個例外同時發生時,能發揮強大威力。
try:
    raise ExceptionGroup("多個例外", [ValueError("無效的值"), TypeError("類型錯誤")])
except* ValueError as ve:
    print(f"ValueError: {ve}")
except* TypeError as te:
    print(f"TypeError: {te}")
藉此,可以將個別例外作為群組處理,同時依類型進行處理。

tomllib:標準支援 TOML 檔案

作為設定檔案格式備受歡迎的 TOML 格式,從 Python 3.11 開始,以 tomllib 標準函式庫支援讀取。 藉此,不需要另外安裝外部函式庫(例如:toml 套件)。
import tomllib

with open("config.toml", "rb") as f:
    config = tomllib.load(f)
print(config["database"]["user"])
這對於使用 pyproject.toml 等 Python 專案來說,是很大的便利性提升。

型別提示相關的強化:Self、TypeVarTuple、Required/NotRequired

Python 3.11 中,靜態型別(typing)功能進一步強化,讓複雜的型別指定和高安全性的設計更容易。
  • Self:方法可以明確指定返回自身實例的型別。
  from typing import Self

  class Builder:
      def set_option(self) -> Self:
          return self
  • TypeVarTuple:對應可變長的泛型型別。可用於長度可變的資料結構如元組(應用較為進階)。
  • Required / NotRequired:與 TypedDict 結合,明確指定必要/任意欄位。
  from typing import TypedDict, NotRequired

  class User(TypedDict):
      name: str
      email: NotRequired[str]
這些功能讓型別安全的程式碼表現力大幅提升。

asyncio.TaskGroup 的新增與非同步處理的改善

非同步處理函式庫 asyncio 也有重大改進。特別是新增了可統整處理多個非同步任務的 TaskGroup,讓程式碼的可讀性大幅提升。
import asyncio

async def fetch_data(n):
    await asyncio.sleep(n)
    print(f"{n} 秒後完成")

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(fetch_data(1))
        tg.create_task(fetch_data(2))
        tg.create_task(fetch_data(3))

asyncio.run(main())
這段程式碼與 asyncio.gather() 相比,更具結構化,並包含例外處理,讓描述更為堅固。

其他細部改善點

  • 堆疊追蹤(錯誤訊息)的可讀性提升(程式碼對應行更清楚顯示)
  • 錯誤訊息的提示更明確(”Did you mean…?” 的改善)
  • 標準函式庫和語法的少量最佳化眾多

小結:新功能是朝「速度」與「明確性」的進化

Python 3.11 的新功能群,在各處可見追求效能與可讀性兼顧的設計。包含許多實用性高的強化,且對既有程式碼影響小,因此是值得積極導入的版本。

4. 【環境建置】Python 3.11 的安裝方法與推薦工具

4-1. OS 別 Python 3.11 安裝方法

Windows 的情況

  1. 存取官方網站(https://www.python.org)
  2. 點擊首頁的「Download Python 3.11.x」
  3. 執行安裝程式,並勾選「Add Python to PATH」
  4. 以「Install Now」進行安裝
安裝後,在命令提示字元執行以下指令以確認動作:
python --version
Python 3.11.x 若顯示即完成。

macOS 的情況(Homebrew)

macOS 使用者可以使用套件管理員 Homebrew 進行安裝,非常方便。
brew install python@3.11
若使用多個版本,則需切換連結:
brew link --overwrite python@3.11

Linux 的情況(Ubuntu 系)

在 Ubuntu 或 Debian 基礎的 Linux 中,官方儲存庫可能不支援 3.11,因此通常使用來源建置或 pyenv。
sudo apt update
sudo apt install -y build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev tk-dev

cd /usr/src
sudo wget https://www.python.org/ftp/python/3.11.x/Python-3.11.x.tgz
sudo tar xzf Python-3.11.x.tgz
cd Python-3.11.x
sudo ./configure --enable-optimizations
sudo make -j$(nproc)
sudo make altinstall
可以使用 python3.11 --version 確認版本。

4-2. 虛擬環境的建立與 Python 版本管理

使用 venv 建立虛擬環境

Python 3.11 也標準包含 venv 模組,可以為每個專案建立獨立的環境。
python3.11 -m venv myenv
source myenv/bin/activate  # Windows 是 myenv\Scripts\activate
在虛擬環境內操作 Python,即可在不影響其他專案的情況下進行開發。

pyenv 的活用(多版本管理)

對於想要切換多個 Python 版本的開發者,強烈推薦導入 pyenv。
# pyenv 安裝(Linux/macOS)
curl https://pyenv.run | bash

# 確認可安裝的版本
pyenv install --list

# Python 3.11 的安裝與設定
pyenv install 3.11.x
pyenv global 3.11.x
使用此方法,可以依專案靈活切換不同版本。

mise(舊名: asdf-python + direnv)也是選擇之一

最近,作為更現代的版本管理工具,mise(舊 asdf + direnv 整合) 也頗受歡迎。由於可以使用 .tool-versions 檔案明確指定 Python 版本,因此適合團隊開發。
侍エンジニア塾

5. 【應用於開發】使用新功能的實務程式碼範例

例1:新的例外群組與 except* 的用法

從 Python 3.11 引入的 ExceptionGroup 類別與 except* 語法,在並行處理中多個例外同時發生的情境中非常有效。
def raise_multiple_exceptions():
    raise ExceptionGroup("多個例外", [
        ValueError("無效的值"),
        TypeError("型別錯誤"),
        RuntimeError("執行時期錯誤")
    ])

try:
    raise_multiple_exceptions()
except* ValueError as ve:
    print("發生 ValueError:", ve)
except* TypeError as te:
    print("發生 TypeError:", te)
像這樣,在一個 try 區塊內可以並行地對多個型別例外進行分支處理,這是其主要特點。

例2:Self 使用的類別設計簡化

過去,在使用方法鏈時,要精確表達傳回值的型別相當困難,但從 Python 3.11 開始,透過引入 typing.Self,能夠撰寫更安全且自我描述性的程式碼。
from typing import Self

class ConfigBuilder:
    def __init__(self):
        self.config = {}

    def set(self, key: str, value: str) -> Self:
        self.config[key] = value
        return self

    def build(self) -> dict:
        return self.config

cfg = ConfigBuilder().set("host", "localhost").set("port", "3306").build()
print(cfg)
即使是鏈結方法,也能進行型別補全,因此在 IDE 中的輔助以及型別檢查的精確度大幅提升。

例3:TypedDict 中的 NotRequired 活用

對於字典型的資料結構,能夠以型別表達任意欄位,這也是 3.11 的魅力之一。
from typing import TypedDict, NotRequired

class UserProfile(TypedDict):
    username: str
    email: NotRequired[str]

def show_user(profile: UserProfile):
    print("使用者名稱:", profile["username"])
    if "email" in profile:
        print("電子郵件:", profile["email"])

show_user({"username": "nao"})
show_user({"username": "nao", "email": "nao@example.com"})
對於字典型 API 的驗證等也很有用,型別提示的輔助變得更加靈活。

例4:asyncio.TaskGroup 整理非同步程式碼

在 Python 的非同步處理中,asyncio 是標準,但 Python 3.11 終於能夠透過工作群組(TaskGroup)進行一括管理。
import asyncio

async def fetch_data(n):
    await asyncio.sleep(n)
    print(f"{{n}} 秒後完成")

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(fetch_data(1))
        tg.create_task(fetch_data(2))
        tg.create_task(fetch_data(3))

asyncio.run(main())
此程式碼與 asyncio.gather() 相比,更具結構化,包括例外處理在內,能夠進行更堅固的描述。

6. 【移行的要點】Python 3.11 的升級與相容性檢查

升級的基本方針:使用虛擬環境

在現有專案中引入 Python 3.11 時,為了不破壞現有環境,使用虛擬環境是鐵則。以下是推薦步驟:
  1. 將 Python 3.11 安裝到系統中
  2. 建立虛擬環境:
   python3.11 -m venv venv311
   source venv311/bin/activate  # Windows 使用 venv311\Scripts\activate
  1. 重新安裝程式庫(使用 requirements.txt):
   pip install -r requirements.txt
透過這種方法分離環境,即可安全地移行到 3.11。

確認程式庫相容性的方法

升級到 Python 3.11 時,最重要的是確認使用的程式庫是否相容新版本。有幾種確認方法:

1. 在 PyPI 官方頁面確認

存取每個程式庫的 PyPI 頁面,檢查「Requires: Python >= X.X」等記載。

2. 確認 pip 的相依性錯誤

在虛擬環境中安裝程式庫時出現的錯誤,能明確判斷是否相容。

3. 使用 caniusepython3 指令進行一括檢查(※部分不推薦)

部分開發者使用 caniusepython3 套件來調查相容性,但最近已停止更新,因此最終推薦在 PyPI 上明確確認

不相容的代表範例:變更的功能或廢止的語法

Python 3.11 雖然破壞性變更不多,但需注意以下幾點:
  • 部分 C 擴充模組的不相容 如果 Cython 或 NumPy 等尚未相容,則可能在建置時失敗。
  • 從不推薦轉為刪除的功能 例如,collections.MutableMapping 等已完全刪除的程式庫也有。
  • 語法的嚴格化 文法錯誤的偵測更嚴格,因此以往僅警告的程式碼可能引發例外。

測試與 CI/CD 的檢討也不能忘記

移行後,透過執行現有測試程式碼來確認在新環境中是否正常運作。特別是使用 CI/CD 的情況下,不要忘記在建置目標的 Python 版本中加入 3.11。 範例:GitHub Actions 中的指定(python-version
- uses: actions/setup-python@v4
  with:
    python-version: "3.11"

移行的最佳實務

要做的事理由・效果
在虛擬環境中確認運作不破壞現有環境,安全升級
調查相依程式庫的相容性防止安裝錯誤或執行時錯誤
事先通過單元測試・CI早期偵測與防止問題
取代不推薦的 API確保長期維護性

小結:謹慎移行即可獲得巨大恩惠

移行到 Python 3.11,只要不怠忽事前準備與相容性檢查,即可獲得極高的回報。為了享受速度提升與程式碼清晰化等優點,階段性移行與測試體制的整備非常重要。

7. 常見問題(FAQ)

Q1. Python 3.11適合初學者推薦嗎?

是的,Python 3.11非常適合初學者推薦。相較於以往版本,執行速度更快,錯誤訊息的可讀性也提升,因此學習中更容易察覺錯誤。此外,即使不使用複雜的新功能,也能以以往的語法進行開發。

Q2. Python 3.10從3.11升級的方法是?

為了不影響現有環境,建議先使用虛擬環境進行驗證。以下是常見的手順:
  1. 安裝 Python 3.11(使用官方網站或 pyenv 等)
  2. 建立虛擬環境,並設定使用 3.11
  3. pip install -r requirements.txt 重新建置程式庫
  4. 使用測試腳本確認動作

Q3. Python 3.11尚未對應的程式庫還有嗎?

2023 年之後,多數主要程式庫(NumPy、pandas、Flask、Django 等)已對應,但部分舊程式庫或依賴 C 擴充的程式庫可能對應較晚。在 PyPI 上確認「Requires: Python >=3.11」的標記,或在虛擬環境中試著安裝確認是最確實的方法。

Q4. Python 3.11 的新功能一定要使用嗎?

不必全部使用。根據專案或團隊的目的,只導入必要的機能即可。例如,TaskGroup在非同步處理頻繁的場合很方便,但一般的業務應用程式不必勉強使用。

Q5. 現在開始新開發,Python 3.10 和 3.11 哪個比較好?

推薦 Python 3.11。高速化之外,還準備了豐富的維護性高的全新機能,預計未來程式庫對應也會以 3.11 以降為主流。目前已整備穩定的使用環境,因此從 3.11 開始是最理想的。

Q6. 需要準備 Python 3.12 或未來版本嗎?

是的。Python 每年都會發布新版本,因此避免使用非推薦 API,並習慣活用型別提示,是對未來的準備。此外,定期確認文件,掌握即將廢止的機能,就能安心。

Q7. Python 3.11 的程式碼會變快是真的嗎?

是真的。透過 CPython 的內部最佳化,官方基準測試報告顯示,相較 3.10 平均快 25%,最高可達 60% 左右。即使只執行現有程式碼,也有可能獲得益處。

Q8. Python 3.11 的新功能適合哪些用途?

新功能易於應用的場景
ExceptionGroup並行處理或非同步處理中的例外管理
TaskGroup複雜非同步處理的程式碼簡化
Self方法鏈或建構者模式
NotRequired彈性的 JSON/API 回應型別設計
tomllib設定檔案(TOML)的讀取

8. 總結與未來展望

Python 3.11 是追求「速度」與「明瞭性」的進化版

Python 3.11 相較於過去版本,具有許多明確的進化要點。特別是以下三點,是許多開發者強烈共鳴的改善點:
  • 最大 60% 的高速化,減輕效能瓶頸
  • 例外處理與非同步控制的強化,讓堅固的應用程式設計成為可能
  • 型別提示功能的強化,讓靜態分析與 IDE 輔助更強大
此外,這些改良「無需大幅改寫現有程式碼即可使用」這一點也是巨大的魅力。可以說是體現 Python 理念「簡單性」與「實用性」的更新。

未來展望:朝 Python 3.12 及後續版本邁進

Python 開發團隊將持續「Faster CPython」專案,目標是進一步的高速化、穩定化與現代化。 特別是未來值得注意的要點如下:
  • JIT 編譯的導入(預定) 更動態最佳化的執行環境正在構想中。
  • 記憶體管理(GC)的改善 預期在大規模系統中提升可擴展性。
  • 錯誤訊息與型別推斷的進一步進化 對初學者的考量與開發體驗的提升將持續進行。
藉此,Python 將從「簡單但緩慢的語言」持續進化為「簡單且高速的語言」。

對讀者的建議

Python 3.11 已經作為穩定版廣泛使用。推薦以下行動。 透過遷移與驗證獲得的見解,一定會在未來的版本升級中派上用場。

最後

Python 3.11 帶來許多有價值的改善,豐富開發者的體驗。對於「差不多該升級版本了」「想寫更現代化的程式碼」的人來說,是最佳選擇。 請把握這個機會,親手體驗 Python 3.11,感受它的魅力。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール