Python 3.14.0がついにリリース!GIL削除、t-strings、サブインタープリタなど盛りだくさん
2025年10月7日、Python 3.14.0が正式にリリースされた。今回のリリースでは、長年の課題だったGIL(Global Interpreter Lock)の削除、新しいテンプレート文字列構文、並列処理を強化するサブインタープリタなど、多くの革新的な機能が追加されている。今回は、Python 3.14.0の主要な新機能について、対話形式で詳しく見ていこう。
リリース情報
- バージョン: Python 3.14.0
- リリース日: 2025年10月7日
- 公式ページ: https://www.python.org/downloads/release/python-3140/
- ドキュメント: https://docs.python.org/3/whatsnew/3.14.html
来春からデータサイエンティストとして働く予定の技術オタク。
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
フリースレッドモード:GILの呪縛からの解放
Python 3.14が出たって聞いた!何がすごいの?
一番大きな変化は、フリースレッドモード(GILなしモード)が正式にサポートされたことなんだ。
GIL?フリースレッド?何それ...
GILは「Global Interpreter Lock」の略で、Pythonの大きな制約の一つだったんだ。簡単に言うと、複数のスレッドを使っても、同時に実行できるのは1つだけっていう仕組みなんだよ。
え!?複数のスレッドを作っても、結局1つずつしか動かないの?
そうなんだ。例えば、4コアのCPUを使っても、Pythonのスレッドは1コア分しか使えなかった。これがマルチコアを活かせない大きな理由だったんだよ。
それって、すごくもったいないじゃん...
だからこそ、Python 3.14でこのGILを削除できるようになったのは大きな進化なんだ。フリースレッドモードを使えば、複数のCPUコアを同時に使えるようになる。
すごい!じゃあかなり速くなるってこと!?
マルチスレッドを活用するプログラムなら、ね。ただ、フリースレッドモードには注意点もある。シングルスレッドで動かすと、普通のPythonより5〜10%遅くなるんだ。
遅くなる!?なんで?
GILを削除すると、スレッド間で安全にデータをやり取りするための仕組みが必要になる。その分、オーバーヘッドが増えるんだよ。Python 3.13では40%も遅くなってたけど、3.14では5〜10%まで改善されたんだ。
40%から5〜10%!大幅に改善されてるね!
そう!しかも、マルチスレッドを使う場合は、CPUコア数にほぼ比例して速くなる。例えば、8コアのCPUなら、理想的には8倍近く速くなるんだ。
フリースレッドモードって、どうやって使うの?
Pythonをビルドする時に、--disable-gilオプションを付けるか、公式サイトから専用のビルドをダウンロードするんだ。Python 3.13では実験的な機能だったけど、3.14からは正式にサポートされたから、本番環境でも使いやすくなったんだよ。
テンプレート文字列(t-strings):新しい文字列処理の形
他にどんな新機能があるの?
テンプレート文字列、通称t-stringsが追加されたんだ。PEP 750で提案された機能だよ。
t-strings?f-stringsなら知ってるけど...
f-stringsの親戚みたいなものだけど、もっと柔軟なんだ。f-stringsは即座に文字列を作るけど、t-stringsは文字列の「レシピ」を作る感じなんだよ。
レシピ?どういうこと?
例を見てみよう。
name = "Pythonista"
day = "Friday"
# f-stringsの場合
f_string = f"Hello, {name}! Today is {day}."
print(f_string) # "Hello, Pythonista! Today is Friday."
# t-stringsの場合
t_string = t"Hello, {name}! Today is {day}."
print(type(t_string)) # <class 'Template'>
t-stringsは、すぐに文字列にならず、Templateオブジェクトになるんだ。
文字列じゃないんだ!?
そう。Templateオブジェクトは、文字列の部品と変数の部分を分けて保持してるんだ。例えば、こんな感じ。
food = "cheese"
template = t"Tasty {food}!"
list(template) # ['Tasty ', Interpolation(value='cheese'), '!']
文字列の部分と変数の部分が分かれてるでしょ?
なるほど。でも、それって何の役に立つの?
いい質問だね!一番大きいのは、HTMLやSQLインジェクションを防げることなんだ。
user_input = "<script>alert('pwn')</script>"
# 危険な例(f-strings)
dangerous = f"<p>{user_input}</p>"
print(dangerous) # <p><script>alert('pwn')</script></p>
# 安全な例(t-strings + HTML関数)
safe = html(t"<p>{user_input}</p>")
print(safe) # <p><script>alert('pwn')</script></p>
t-stringsを使うと、変数の内容を自動的にエスケープできるんだよ。
セキュリティ対策になるんだ!すごい!
他にも、カスタムフォーマットを定義したり、国際化対応を簡単にしたり、いろんな使い道があるんだ。文字列をただ作るだけじゃなくて、処理してから使いたい時に便利なんだよ。
サブインタープリタ:並列処理の新しいアプローチ
並列処理って、さっきのフリースレッドモード以外にもあるの?
そうなんだ!Python 3.14では、サブインタープリタが標準ライブラリに追加されたんだ。PEP 734で提案された機能だよ。
サブインタープリタ?インタープリタが複数あるってこと?
まさにその通り!1つのプロセスの中で、複数のPythonインタープリタを動かせるようになったんだ。
1つのプロセスで複数!?どういうこと?
今までPythonで並列処理をする場合、主に2つの方法があったんだ。
1つはthreadingモジュールを使う方法。でも、GILのせいで本当の並列実行はできなかった。
もう1つはmultiprocessingモジュールを使う方法。別々のプロセスを立ち上げるから、GILの制約を受けない。でも、プロセスを作るのはコストが高いし、メモリも余計に使うんだ。
サブインタープリタは、その中間みたいな感じ?
そう、いいところ取りなんだ!プロセスのように完全に独立してるけど、スレッドのように軽量なんだよ。
import concurrent.interpreters as interpreters
# サブインタープリタを作成
interp = interpreters.create()
# コードを実行
code = """
def calculate(n):
return sum(range(n))
result = calculate(1000000)
print(f"Result: {result}")
"""
interpreters.run_string(interp, code)
各サブインタープリタは独立したGILを持つから、並列実行できるんだ。
軽くて並列実行できる!最高じゃん!
しかも、concurrent.futuresと統合されてるから、使いやすいんだ。
from concurrent.futures import InterpreterPoolExecutor
def heavy_calculation(n):
return sum(i * i for i in range(n))
# サブインタープリタのプールを作成
with InterpreterPoolExecutor(max_workers=4) as executor:
# 並列実行
results = executor.map(heavy_calculation, [1000000, 2000000, 3000000])
for result in results:
print(result)
ProcessPoolExecutorと同じように使えるけど、プロセスより効率的なんだよ。
でも、サブインタープリタ同士でデータをやり取りするのは?
それは制約があるんだ。基本的には、プリミティブな型(数値、文字列、バイト列など)しか直接やり取りできない。複雑なオブジェクトは渡せないんだよ。
えー、不便そう...
確かに制約はあるけど、その分安全なんだ。データの共有を制限することで、競合状態やデッドロックを防げる。必要なら、シリアライズして渡すこともできるしね。
遅延アノテーション:PEP 649の実装
他に大きな変更はある?
PEP 649の遅延アノテーションが実装されたんだ。これはアノテーションの扱い方を変える大きな変更なんだよ。
アノテーション?型ヒントのこと?
そう!例えば、こんなコードを見たことあるよね。
def greet(name: str) -> str:
return f"Hello, {name}!"
この: strや-> strがアノテーションだよ。
それが、どう変わったの?
今までは、関数を定義した瞬間にアノテーションが評価されてたんだ。でも、Python 3.14からは、実際に__annotations__にアクセスするまで評価されなくなったんだよ。
評価されないって、どういうこと?
例えば、前方参照の問題があったんだ。
# Python 3.13以前は、これはエラーになってた
def create_node(value: int, next: Node) -> Node:
...
class Node:
def __init__(self, value: int):
self.value = value
create_nodeを定義する時点では、まだNodeクラスが定義されてないから、エラーになってたんだ。
あー、よく文字列で囲んでたやつだ!next: "Node"みたいに
そう!でも、Python 3.14からは、文字列で囲まなくても大丈夫になったんだ。アノテーションは定義時じゃなくて、実際に必要になった時に評価されるからね。
それは便利!わざわざ文字列にしなくてよくなるんだね
しかも、パフォーマンスも改善されるんだ。複雑なアノテーションを持つ関数をたくさん定義しても、使わなければ評価されないから、起動時間が短くなるんだよ。
デメリットはないの?
互換性の問題はある。__annotations__に直接アクセスしてたコードは、動作が変わる可能性があるんだ。でも、新しいannotationlibモジュールが追加されて、柔軟に扱えるようになったんだよ。
その他の改善点
他にも変更点はあるの?
たくさんあるよ!まず、REPLが大幅に改善されたんだ。
REPL?
Read-Eval-Print Loopの略で、pythonコマンドで起動する対話モードのことだよ。Python 3.14では、複数行編集、改善されたタブ補完、シンタックスハイライトが追加されたんだ。
シンタックスハイライト!コードが色付きで見やすくなるってこと?
その通り!他にも、標準ライブラリに新しいモジュールが追加されたんだ。
compression.zstd: Zstandard圧縮のサポートannotationlib: アノテーションを扱うためのライブラリstring.templatelib: t-stringsのサポートライブラリ
Zstandard?
新しい圧縮形式だよ。gzipやbzip2より高速で、圧縮率も良いんだ。Facebookが開発した圧縮アルゴリズムなんだよ。
Facebookが!
あと、pdbデバッガも改善されて、実行中のPythonプロセスにリモートでアタッチできるようになったんだ。
# 実行中のプロセスにアタッチ
python -m pdb -p 12345
これで、動いているプログラムをデバッグできるようになったんだよ。
それは便利!本番環境のバグも調べやすくなりそう!
UUIDのサポートも拡張されて、UUID バージョン6、7、8が追加された。タイムスタンプを含むUUIDが作れるようになったんだ。
import uuid
# タイムスタンプベースのUUID(バージョン7)
uuid7 = uuid.uuid7()
print(uuid7)
タイムスタンプが入ってると何がいいの?
UUIDをソートできるようになるんだ。データベースのインデックスとして使う時に、パフォーマンスが改善されるんだよ。
パフォーマンスの改善
全体的に速くなったの?
いくつかの重要な最適化があるんだ。まず、インクリメンタルガベージコレクションが導入されたんだよ。
ガベージコレクション?
使わなくなったメモリを自動的に解放する仕組みだよ。今までは、一度にまとめて処理してたから、瞬間的に動作が止まることがあったんだ。
止まるのは嫌だね...
インクリメンタルガベージコレクションは、少しずつ処理するから、止まる時間が短くなるんだ。レスポンシブなアプリケーションには重要な改善だよ。
なるほど!ゲームとかリアルタイムな処理に良さそう!
それから、新しいテールコール最適化が追加されたんだ。再帰関数のパフォーマンスが改善されたんだよ。
テールコール?
関数の最後で別の関数を呼び出す時に、スタックを積まずに実行できる最適化なんだ。再帰が深くても、スタックオーバーフローしにくくなるんだよ。
どのくらい速くなったの?
ワークロードによるけど、標準ライブラリのいくつかのモジュールで、5〜15%の高速化が報告されてるんだ。特に、文字列処理や数値計算が改善されてる。
エラーメッセージの改善
エラーメッセージも変わったの?
Python 3.14では、エラーメッセージがさらに親切になったんだ。タイポした時に、正しいキーワードを提案してくれるようになったんだよ。
# 間違ったコード
improt os
# エラーメッセージ
# SyntaxError: invalid syntax. Did you mean 'import'?
おお!それは助かる!
他にも、構文エラーの時に、どこが間違ってるかがより明確に示されるようになったんだ。矢印や下線で、問題のある箇所を正確に指摘してくれるんだよ。
初心者に優しくなってるんだね!
制御フローの変更
言語仕様の変更はある?
PEP 765で、finallyブロックでのreturn、break、continueの使用が禁止されたんだ。
なんで禁止するの?
混乱を招くからなんだ。例えば、こんなコードを見てみよう。
def confusing():
try:
return "from try"
finally:
return "from finally" # これが禁止された
print(confusing()) # 何が返ってくる?
これ、どっちが返ってくると思う?
えーと...tryブロックの方?
実は、finallyブロックの方が返ってくるんだ。finallyがtryの結果を上書きしちゃうんだよ。
え!?それって混乱する!
だから禁止されたんだ。Python 3.14からは、こういうコードを書くとエラーになるんだよ。コードの意図が明確になって、バグを減らせるんだ。
非推奨と削除
削除された機能もあるの?
いくつかの古いモジュールや機能が削除されたんだ。例えば、impモジュールが完全に削除されたよ。
impモジュール?
古いインポートシステムのモジュールだよ。Python 3.4でimportlibに置き換えられて、長い間非推奨だったんだ。もう10年以上前のことだから、影響を受けるコードは少ないはずだよ。
他には?
waveモジュールの古いAPIとか、いくつかの非推奨だった関数が削除されたんだ。でも、基本的には、何年も前から警告が出てた機能ばかりだから、普通に使ってる分には問題ないよ。
まとめと今後の展望
Python 3.14は、パフォーマンス、並行性、開発体験の3つの面で大きく進化したんだ。
フリースレッドモードによって、マルチコアCPUを本当に活用できるようになった。サブインタープリタで、効率的な並列処理が可能になった。t-stringsで、より安全で柔軟な文字列処理ができるようになった。
これらの機能は、Pythonを「遅い」という批判から解放する重要なステップなんだ。特に、フリースレッドモードは、長年の課題だったGILの制約を克服する画期的な改善だよ。
Pythonがどんどん進化してるんだね!
ただ、これらの新機能を最大限に活用するには、コードの書き方を変える必要がある場合もあるんだ。フリースレッドモードやサブインタープリタは、既存のコードがそのまま速くなるわけじゃない。並列処理を意識した設計が必要なんだよ。
じゃあ、すぐにPython 3.14に移行すべき?
それは状況によるね。新しい機能を使いたいなら、移行する価値は十分にある。でも、本番環境で使うなら、ライブラリのサポート状況を確認した方がいい。特に、フリースレッドモードは、C拡張モジュールの対応が必要だからね。
とはいえ、Python 3.14は互換性を重視してるから、通常の使い方なら問題なく移行できるはずだよ。Python 3.13のサポート期間中に、徐々に移行を進めるのがおすすめだね。
Python 3.14、楽しみになってきた!
これからのPythonの進化も楽しみだね。次のPython 3.15では、さらなる最適化や新機能が予定されてるんだ。Pythonコミュニティの活発な開発によって、Pythonはこれからも進化し続けるよ。
参考リンク
- Python 3.14.0リリースノート: https://www.python.org/downloads/release/python-3140/
- What's New In Python 3.14: https://docs.python.org/3/whatsnew/3.14.html
- PEP 649 – Deferred Evaluation Of Annotations: https://peps.python.org/pep-0649/
- PEP 734 – Multiple Interpreters in the Stdlib: https://peps.python.org/pep-0734/
- PEP 750 – Template Strings: https://peps.python.org/pep-0750/
- PEP 779 – Free-threaded CPython Support: https://peps.python.org/pep-0779/