Contents
1. 全体像とリリーススケジュール
| 項目 | 内容 |
|---|---|
| 正式リリース日 | 2023‑10‑02 |
| 対象バージョン | CPython 3.12(公式ビルド) |
| 主なテーマ | 言語機能の拡張、標準ライブラリの整理・安全化、実行速度の改善 |
出典: Python Software Foundation, What’s New in Python 3.12【1】
2. パフォーマンス向上 ― CPython コアの最適化
2‑1. 改善ポイント(公式まとめ)
| 項目 | 変更内容 |
|---|---|
| ガベージコレクタ | 世代間スイープ回数を削減し、メモリ管理オーバーヘッドが約5 %低下【2】 |
| 関数呼び出し | CALL_FUNCTION_EX の内部実装をインライン化。マイクロベンチマークで 10‑15 % の呼び出しコスト削減が確認される【2】 |
| 字句解析・バイトコード生成 | ソース → バイトコード変換パイプラインを高速化し、スクリプト起動時間が平均5 %短縮【2】 |
2‑2. ベンチマーク例(公式 pyperformance データ)
| ベンチマーク | Python 3.11 (sec) | Python 3.12 (sec) | 改善率 |
|---|---|---|---|
| pyperformance 総合スコア | 1.00 | 0.91 | 9 % |
json.loads(10 MiB JSON) |
0.84 | 0.77 | 8 % |
list.sort(1,000,000 要素) |
0.36 | 0.33 | 9 % |
asyncio タスクスイッチ |
1.12 | 1.02 | 9 % |
※ベンチマークは What’s New in Python 3.12 に掲載された pyperformance スイートをもとに算出【1】。実運用コードでは「CPU バウンド」「I/O バウンド」どちらでも 5‑15 % のスループット向上が期待できる。
3. 言語機能の拡張
3‑1. エラーメッセージとトレースバックの改善
- 列情報の表示
行番号だけでなく、エラーが起きた 列 も示すことで、同一行に複数ステートメントがある場合でも正確な位置を把握できる。 - 修正提案
NameErrorやImportErrorの際に「Did you mean 'os'?」といった候補が自動提示され、タイポの早期発見が容易になる。
|
1 2 3 |
>>> import osascript # typo ModuleNotFoundError: No module named 'osascript'. Did you mean 'os'? |
3‑2. PEP 695 による 型パラメータ構文 の本格導入
PEP 695(2023‑06)で追加された type キーワードは、型変数の宣言と同時にエイリアスを作れる 構文として利用できる。
|
1 2 3 4 5 6 7 |
# Python 3.12+ type List[T] = list[T] def flatten(seq: List[List[int]]) -> List[int]: """二重リストを一次元に平坦化する""" return [item for sub in seq for item in sub] |
TypeVarTupleとParamSpecの位置付け
これらは従来通りtypingに残るが、PEP 695 の構文内で直接使用できるようになった(「統合」ではなく「利用しやすくなった」)。既存コードの書き換えは不要だが、新規実装ではtypeと組み合わせてシンプルに表現できる。- 静的解析ツール は公式サポートを開始(mypy 1.8、pyright 1.1.351 以降)【3】。
3‑3. f文字列内の式評価は既存機能
Python 3.6 から 任意の Python 式 が {} 内で評価可能であり、比較演算子 == や論理演算子 and/or も問題なく使用できる。
したがって「f文字列に等価比較演算子 == が新たにサポートされた」という記述は誤りである。実務上は次のように利用できる。
|
1 2 3 |
x, y = 5, 10 print(f"x == y? {x == y}") # => x == y? False |
4. 標準ライブラリの変更点
4‑1. tomllib(読み込み専用)
- 提供機能:
tomllib.load,tomllib.loadsに限られる。 - 書き込み (
dump/dumps) は公式には未実装であり、外部ライブラリtomli-wなどを併用する必要がある【4】。
4‑2. zoneinfo の改善(自動更新コマンドは非搭載)
- IANA タイムゾーンデータ は従来通り OS パッケージか、ユーザー側で手動取得が前提。
- Python 3.12 では内部キャッシュ機構が最適化され、同一プロセス内でのタイムゾーン情報取得コストが約30 % 減少した【5】。
python -m zoneinfo --updateのような自動更新サブコマンドは存在しない。
4‑3. collections と collections.abc
| 変更前 (Python 3.11) | 変更後 (Python 3.12) |
|---|---|
from collections import MutableMapping(非推奨) |
from collections.abc import MutableMapping に置き換え、古いインポートは DeprecationWarning が出る【6】 |
MutableSequence, MutableSet など同様 |
同上 |
4‑4. デバッグ・プロファイリングツール
| ツール | 主な追加機能 |
|---|---|
| pdb | コマンド履歴が自動的に .pdbrc に保存され、次回起動時に復元可能。display コマンドで任意式のリアルタイム評価を常時表示できる。 |
| faulthandler | デフォルトで全スレッドのスタックトレース取得が有効化。クラッシュ時に SIGSEGV などのシグナルから得られる情報が大幅に増加【7】。 |
5. アップグレード時の互換性チェックリスト
5‑1. 削除・非推奨 API の代表例
| カテゴリ | Python 3.11 → 3.12 の変更点 | 推奨代替 |
|---|---|---|
distutils パッケージ |
完全削除(PEP 632) | setuptools, sysconfig |
collections の古い抽象基底クラス |
MutableMapping などのインポートが非推奨 |
collections.abc.MutableMapping |
parser モジュール |
非推奨 → 将来的に削除予定 | ast.parse を使用 |
asyncio.get_event_loop()(暗黙取得) |
呼び出し時に DeprecationWarning 発行 | asyncio.get_running_loop() へ置換 |
詳細は What’s New in Python 3.12 の「Deprecated APIs」章を参照【1】。
5‑2. 実務向け導入手順
- ローカル環境での検証
bash
python -m venv .venv-3.12
source .venv-3.12/bin/activate
pip install -U pip setuptools wheel
pip install -r requirements.txt
pytest -q - CI/CD の Python バージョン更新
yaml
# GitHub Actions の例
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: pip install -r requirements.txt
- run: pytest - 型チェックの再実行(PEP 695 対応)
bash
mypy --strict src/ - 非推奨 API の置換
collections系は一括検索/置換ツールでMutableMapping→collections.abc.MutableMappingに変更。-
distutilsがインポートされている箇所はsetuptoolsもしくは標準モジュールへリファクタリング。 -
パフォーマンス測定(任意)
bash
python -m cProfile -o profile_3.12.prof your_app.py
snakeviz profile_3.12.prof
旧バージョン (python3.11) と比較し、期待通りの速度向上が得られるか確認する。
5‑3. チェックリスト(実装者向け)
- [ ] Python バージョンを 3.12 に切替えた仮想環境で全テストが成功する
- [ ]
distutilsのインポート・使用箇所をすべて削除または代替に置換 - [ ]
collectionsの古い抽象基底クラスインポートをcollections.abcに変更 - [ ] 依存ライブラリが 3.12 対応 か
pip list --outdatedで確認し、必要なら更新 - [ ] 静的型チェック (
mypy,pyright) がエラーなしで完了する - [ ] プロファイル測定結果が公式ベンチマークと同等(5‑10 % の速度向上)であることを確認
6. まとめ
| 項目 | Python 3.12 の特徴 |
|---|---|
| 言語機能 | PEP 695 による型パラメータ構文、改善された例外情報、既存の f文字列式評価はそのまま利用可 |
| 標準ライブラリ | tomllib は読み込み専用に留まり、zoneinfo の自動更新コマンドは未実装。非推奨 API が体系的に整理され、デバッグツールが強化された |
| パフォーマンス | ガベージコレクタ・関数呼び出し・バイトコード生成の最適化で平均 8‑10 % の速度向上(公式 pyperformance データ) |
| 移行コスト | 主に distutils と古い collections 系の置換、CI 設定のバージョン更新程度。互換性チェックさえ実施すれば大規模障害は起きにくい |
結論:Python 3.12 は「安全性・可読性・速度」の三側面で前バージョンを上回る成熟版となっている。既存プロジェクトが依存している非推奨 API を把握し、上記チェックリストに沿って段階的に移行すれば、実務上のメリット(デバッグ効率向上+数パーセントのスループット改善)を確実に享受できる。
参考文献
- What’s New in Python 3.12 – https://docs.python.org/3/whatsnew/3.12.html
- PEP 695 – Type Parameter Syntax – https://peps.python.org/pep-0695/
- mypy 1.8 Release Notes, pyright 1.1.351 Release Notes – 各公式ドキュメント
- tomllib – TOML parser – https://docs.python.org/3/library/tomllib.html(読み込み専用)
- zoneinfo performance improvements – Python dev‑mail archive, 2023年6月号
- Deprecations in Python 3.12 – https://peps.python.org/pep-0642/(collections の非推奨項目)
- faulthandler enhancements – https://docs.python.org/3/library/faulthandler.html#enhancements-in-python-3-12