Python 3.14.0がついにリリース!GIL削除、t-strings、サブインタープリタなど盛りだくさん

2025年10月7日にリリースされたPython 3.14.0の主要な新機能を解説。フリースレッドモード、テンプレート文字列、並列処理の新機能など、Pythonの進化を追う。

Python 3.14.0がついにリリース!GIL削除、t-strings、サブインタープリタなど盛りだくさん

2025年10月7日、Python 3.14.0が正式にリリースされた。今回のリリースでは、長年の課題だったGIL(Global Interpreter Lock)の削除、新しいテンプレート文字列構文、並列処理を強化するサブインタープリタなど、多くの革新的な機能が追加されている。今回は、Python 3.14.0の主要な新機能について、対話形式で詳しく見ていこう。

リリース情報

著者
著者: Sera
大学院でAI作曲に関して研究中!
来春からデータサイエンティストとして働く予定の技術オタク。
初心者
登場人物: あかり
流行りのAIやWeb技術に興味津々!
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。

フリースレッドモード:GILの呪縛からの解放

excitedの表情
初心者

Python 3.14が出たって聞いた!何がすごいの?

専門家

一番大きな変化は、フリースレッドモード(GILなしモード)が正式にサポートされたことなんだ。

confusedの表情
初心者

GIL?フリースレッド?何それ...

専門家

GILは「Global Interpreter Lock」の略で、Pythonの大きな制約の一つだったんだ。簡単に言うと、複数のスレッドを使っても、同時に実行できるのは1つだけっていう仕組みなんだよ。

surprisedの表情
初心者

え!?複数のスレッドを作っても、結局1つずつしか動かないの?

専門家

そうなんだ。例えば、4コアのCPUを使っても、Pythonのスレッドは1コア分しか使えなかった。これがマルチコアを活かせない大きな理由だったんだよ。

sadの表情
初心者

それって、すごくもったいないじゃん...

専門家

だからこそ、Python 3.14でこのGILを削除できるようになったのは大きな進化なんだ。フリースレッドモードを使えば、複数のCPUコアを同時に使えるようになる。

excitedの表情
初心者

すごい!じゃあかなり速くなるってこと!?

専門家

マルチスレッドを活用するプログラムなら、ね。ただ、フリースレッドモードには注意点もある。シングルスレッドで動かすと、普通のPythonより5〜10%遅くなるんだ。

confusedの表情
初心者

遅くなる!?なんで?

専門家

GILを削除すると、スレッド間で安全にデータをやり取りするための仕組みが必要になる。その分、オーバーヘッドが増えるんだよ。Python 3.13では40%も遅くなってたけど、3.14では5〜10%まで改善されたんだ。

happyの表情
初心者

40%から5〜10%!大幅に改善されてるね!

専門家

そう!しかも、マルチスレッドを使う場合は、CPUコア数にほぼ比例して速くなる。例えば、8コアのCPUなら、理想的には8倍近く速くなるんだ。

normalの表情
初心者

フリースレッドモードって、どうやって使うの?

専門家

Pythonをビルドする時に、--disable-gilオプションを付けるか、公式サイトから専用のビルドをダウンロードするんだ。Python 3.13では実験的な機能だったけど、3.14からは正式にサポートされたから、本番環境でも使いやすくなったんだよ。

テンプレート文字列(t-strings):新しい文字列処理の形

normalの表情
初心者

他にどんな新機能があるの?

専門家

テンプレート文字列、通称t-stringsが追加されたんだ。PEP 750で提案された機能だよ。

confusedの表情
初心者

t-strings?f-stringsなら知ってるけど...

専門家

f-stringsの親戚みたいなものだけど、もっと柔軟なんだ。f-stringsは即座に文字列を作るけど、t-stringsは文字列の「レシピ」を作る感じなんだよ。

confusedの表情
初心者

レシピ?どういうこと?

専門家

例を見てみよう。

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オブジェクトになるんだ。

surprisedの表情
初心者

文字列じゃないんだ!?

専門家

そう。Templateオブジェクトは、文字列の部品と変数の部分を分けて保持してるんだ。例えば、こんな感じ。

food = "cheese"
template = t"Tasty {food}!"
list(template)  # ['Tasty ', Interpolation(value='cheese'), '!']

文字列の部分と変数の部分が分かれてるでしょ?

normalの表情
初心者

なるほど。でも、それって何の役に立つの?

専門家

いい質問だね!一番大きいのは、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>&lt;script&gt;alert('pwn')&lt;/script&gt;</p>

t-stringsを使うと、変数の内容を自動的にエスケープできるんだよ。

surprisedの表情
初心者

セキュリティ対策になるんだ!すごい!

専門家

他にも、カスタムフォーマットを定義したり、国際化対応を簡単にしたり、いろんな使い道があるんだ。文字列をただ作るだけじゃなくて、処理してから使いたい時に便利なんだよ。

サブインタープリタ:並列処理の新しいアプローチ

normalの表情
初心者

並列処理って、さっきのフリースレッドモード以外にもあるの?

専門家

そうなんだ!Python 3.14では、サブインタープリタが標準ライブラリに追加されたんだ。PEP 734で提案された機能だよ。

confusedの表情
初心者

サブインタープリタ?インタープリタが複数あるってこと?

専門家

まさにその通り!1つのプロセスの中で、複数のPythonインタープリタを動かせるようになったんだ。

surprisedの表情
初心者

1つのプロセスで複数!?どういうこと?

専門家

今までPythonで並列処理をする場合、主に2つの方法があったんだ。

1つはthreadingモジュールを使う方法。でも、GILのせいで本当の並列実行はできなかった。

もう1つはmultiprocessingモジュールを使う方法。別々のプロセスを立ち上げるから、GILの制約を受けない。でも、プロセスを作るのはコストが高いし、メモリも余計に使うんだ。

normalの表情
初心者

サブインタープリタは、その中間みたいな感じ?

専門家

そう、いいところ取りなんだ!プロセスのように完全に独立してるけど、スレッドのように軽量なんだよ。

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を持つから、並列実行できるんだ。

excitedの表情
初心者

軽くて並列実行できる!最高じゃん!

専門家

しかも、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と同じように使えるけど、プロセスより効率的なんだよ。

confusedの表情
初心者

でも、サブインタープリタ同士でデータをやり取りするのは?

専門家

それは制約があるんだ。基本的には、プリミティブな型(数値、文字列、バイト列など)しか直接やり取りできない。複雑なオブジェクトは渡せないんだよ。

sadの表情
初心者

えー、不便そう...

専門家

確かに制約はあるけど、その分安全なんだ。データの共有を制限することで、競合状態やデッドロックを防げる。必要なら、シリアライズして渡すこともできるしね。

遅延アノテーション:PEP 649の実装

normalの表情
初心者

他に大きな変更はある?

専門家

PEP 649の遅延アノテーションが実装されたんだ。これはアノテーションの扱い方を変える大きな変更なんだよ。

confusedの表情
初心者

アノテーション?型ヒントのこと?

専門家

そう!例えば、こんなコードを見たことあるよね。

def greet(name: str) -> str:
    return f"Hello, {name}!"

この: str-> strがアノテーションだよ。

normalの表情
初心者

それが、どう変わったの?

専門家

今までは、関数を定義した瞬間にアノテーションが評価されてたんだ。でも、Python 3.14からは、実際に__annotations__にアクセスするまで評価されなくなったんだよ。

confusedの表情
初心者

評価されないって、どういうこと?

専門家

例えば、前方参照の問題があったんだ。

# Python 3.13以前は、これはエラーになってた
def create_node(value: int, next: Node) -> Node:
    ...

class Node:
    def __init__(self, value: int):
        self.value = value

create_nodeを定義する時点では、まだNodeクラスが定義されてないから、エラーになってたんだ。

surprisedの表情
初心者

あー、よく文字列で囲んでたやつだ!next: "Node"みたいに

専門家

そう!でも、Python 3.14からは、文字列で囲まなくても大丈夫になったんだ。アノテーションは定義時じゃなくて、実際に必要になった時に評価されるからね。

happyの表情
初心者

それは便利!わざわざ文字列にしなくてよくなるんだね

専門家

しかも、パフォーマンスも改善されるんだ。複雑なアノテーションを持つ関数をたくさん定義しても、使わなければ評価されないから、起動時間が短くなるんだよ。

normalの表情
初心者

デメリットはないの?

専門家

互換性の問題はある。__annotations__に直接アクセスしてたコードは、動作が変わる可能性があるんだ。でも、新しいannotationlibモジュールが追加されて、柔軟に扱えるようになったんだよ。

その他の改善点

normalの表情
初心者

他にも変更点はあるの?

専門家

たくさんあるよ!まず、REPLが大幅に改善されたんだ。

confusedの表情
初心者

REPL?

専門家

Read-Eval-Print Loopの略で、pythonコマンドで起動する対話モードのことだよ。Python 3.14では、複数行編集、改善されたタブ補完、シンタックスハイライトが追加されたんだ。

excitedの表情
初心者

シンタックスハイライト!コードが色付きで見やすくなるってこと?

専門家

その通り!他にも、標準ライブラリに新しいモジュールが追加されたんだ。

  • compression.zstd: Zstandard圧縮のサポート
  • annotationlib: アノテーションを扱うためのライブラリ
  • string.templatelib: t-stringsのサポートライブラリ
normalの表情
初心者

Zstandard?

専門家

新しい圧縮形式だよ。gzipやbzip2より高速で、圧縮率も良いんだ。Facebookが開発した圧縮アルゴリズムなんだよ。

surprisedの表情
初心者

Facebookが!

専門家

あと、pdbデバッガも改善されて、実行中のPythonプロセスにリモートでアタッチできるようになったんだ。

# 実行中のプロセスにアタッチ
python -m pdb -p 12345

これで、動いているプログラムをデバッグできるようになったんだよ。

excitedの表情
初心者

それは便利!本番環境のバグも調べやすくなりそう!

専門家

UUIDのサポートも拡張されて、UUID バージョン6、7、8が追加された。タイムスタンプを含むUUIDが作れるようになったんだ。

import uuid

# タイムスタンプベースのUUID(バージョン7)
uuid7 = uuid.uuid7()
print(uuid7)
normalの表情
初心者

タイムスタンプが入ってると何がいいの?

専門家

UUIDをソートできるようになるんだ。データベースのインデックスとして使う時に、パフォーマンスが改善されるんだよ。

パフォーマンスの改善

normalの表情
初心者

全体的に速くなったの?

専門家

いくつかの重要な最適化があるんだ。まず、インクリメンタルガベージコレクションが導入されたんだよ。

confusedの表情
初心者

ガベージコレクション?

専門家

使わなくなったメモリを自動的に解放する仕組みだよ。今までは、一度にまとめて処理してたから、瞬間的に動作が止まることがあったんだ。

sadの表情
初心者

止まるのは嫌だね...

専門家

インクリメンタルガベージコレクションは、少しずつ処理するから、止まる時間が短くなるんだ。レスポンシブなアプリケーションには重要な改善だよ。

happyの表情
初心者

なるほど!ゲームとかリアルタイムな処理に良さそう!

専門家

それから、新しいテールコール最適化が追加されたんだ。再帰関数のパフォーマンスが改善されたんだよ。

confusedの表情
初心者

テールコール?

専門家

関数の最後で別の関数を呼び出す時に、スタックを積まずに実行できる最適化なんだ。再帰が深くても、スタックオーバーフローしにくくなるんだよ。

normalの表情
初心者

どのくらい速くなったの?

専門家

ワークロードによるけど、標準ライブラリのいくつかのモジュールで、5〜15%の高速化が報告されてるんだ。特に、文字列処理や数値計算が改善されてる。

エラーメッセージの改善

normalの表情
初心者

エラーメッセージも変わったの?

専門家

Python 3.14では、エラーメッセージがさらに親切になったんだ。タイポした時に、正しいキーワードを提案してくれるようになったんだよ。

# 間違ったコード
improt os

# エラーメッセージ
# SyntaxError: invalid syntax. Did you mean 'import'?
excitedの表情
初心者

おお!それは助かる!

専門家

他にも、構文エラーの時に、どこが間違ってるかがより明確に示されるようになったんだ。矢印や下線で、問題のある箇所を正確に指摘してくれるんだよ。

happyの表情
初心者

初心者に優しくなってるんだね!

制御フローの変更

normalの表情
初心者

言語仕様の変更はある?

専門家

PEP 765で、finallyブロックでのreturnbreakcontinueの使用が禁止されたんだ。

confusedの表情
初心者

なんで禁止するの?

専門家

混乱を招くからなんだ。例えば、こんなコードを見てみよう。

def confusing():
    try:
        return "from try"
    finally:
        return "from finally"  # これが禁止された

print(confusing())  # 何が返ってくる?

これ、どっちが返ってくると思う?

confusedの表情
初心者

えーと...tryブロックの方?

専門家

実は、finallyブロックの方が返ってくるんだ。finallytryの結果を上書きしちゃうんだよ。

surprisedの表情
初心者

え!?それって混乱する!

専門家

だから禁止されたんだ。Python 3.14からは、こういうコードを書くとエラーになるんだよ。コードの意図が明確になって、バグを減らせるんだ。

非推奨と削除

normalの表情
初心者

削除された機能もあるの?

専門家

いくつかの古いモジュールや機能が削除されたんだ。例えば、impモジュールが完全に削除されたよ。

confusedの表情
初心者

impモジュール?

専門家

古いインポートシステムのモジュールだよ。Python 3.4でimportlibに置き換えられて、長い間非推奨だったんだ。もう10年以上前のことだから、影響を受けるコードは少ないはずだよ。

normalの表情
初心者

他には?

専門家

waveモジュールの古いAPIとか、いくつかの非推奨だった関数が削除されたんだ。でも、基本的には、何年も前から警告が出てた機能ばかりだから、普通に使ってる分には問題ないよ。

まとめと今後の展望

専門家

Python 3.14は、パフォーマンス、並行性、開発体験の3つの面で大きく進化したんだ。

フリースレッドモードによって、マルチコアCPUを本当に活用できるようになった。サブインタープリタで、効率的な並列処理が可能になった。t-stringsで、より安全で柔軟な文字列処理ができるようになった。

これらの機能は、Pythonを「遅い」という批判から解放する重要なステップなんだ。特に、フリースレッドモードは、長年の課題だったGILの制約を克服する画期的な改善だよ。

excitedの表情
初心者

Pythonがどんどん進化してるんだね!

専門家

ただ、これらの新機能を最大限に活用するには、コードの書き方を変える必要がある場合もあるんだ。フリースレッドモードやサブインタープリタは、既存のコードがそのまま速くなるわけじゃない。並列処理を意識した設計が必要なんだよ。

normalの表情
初心者

じゃあ、すぐにPython 3.14に移行すべき?

専門家

それは状況によるね。新しい機能を使いたいなら、移行する価値は十分にある。でも、本番環境で使うなら、ライブラリのサポート状況を確認した方がいい。特に、フリースレッドモードは、C拡張モジュールの対応が必要だからね。

とはいえ、Python 3.14は互換性を重視してるから、通常の使い方なら問題なく移行できるはずだよ。Python 3.13のサポート期間中に、徐々に移行を進めるのがおすすめだね。

happyの表情
初心者

Python 3.14、楽しみになってきた!

専門家

これからのPythonの進化も楽しみだね。次のPython 3.15では、さらなる最適化や新機能が予定されてるんだ。Pythonコミュニティの活発な開発によって、Pythonはこれからも進化し続けるよ。

参考リンク

← ブログ一覧に戻る