LabHub

ブログ

モダン Python 2026 — Python 3.13 / 3.14 / free-threaded / uv / Ruff / Polars 1.0 / FastAPI / Litestar / Robyn 徹底ガイド

한국어English日本語

プロローグ — 30年ぶりの二つの変曲点

Python は 1991 年に誕生した。2026 年で 35 歳。1.x から 2.x、3.x を経て、動的型付け言語の代表格、データと ML の lingua franca、バックエンドマイクロサービスの一角となった。だが二つの慢性的不満があった。

  1. GIL(Global Interpreter Lock) — CPython の単一の巨大ロック。CPU バウンドのマルチスレッドが事実上不可能だった。「Python は遅い」という評判の半分はここから来ていた。
  2. パッケージング・ツール群の断片化 — pip、easy_install、conda、poetry、pipenv、pdm、hatch、rye…どれが正解かの合意がなかった。しかも全部遅かった。

2024〜2026 年は、この二つの慢性疾患が 同時に 大手術を受けた時期だ。

この記事はこれら全てを一気に見る。「どのツールを選ぶか」ではなく「なぜこの変化が起きたのか、どんなトレードオフがあるのか」を。コード例とコマンド、そして実際の意思決定ガイドまで。


1章 · 2026 年のモダン Python 風景

2026 年 5 月時点で、新しい Python プロジェクトを始めると仮定しよう。5 年前との手順の違い。

2021 年:

pyenv install 3.10.0
pyenv local 3.10.0
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
pip-compile requirements.in
flake8 .
black .
isort .
mypy .
pytest

2026 年:

uv init                       # pyproject.toml + .python-version を自動生成
uv python install 3.14        # Python インタプリタも uv が管理
uv add fastapi polars         # 依存追加 + lock + インストール
uv run ruff check --fix .     # lint
uv run ruff format .          # format
uv run ty check .             # type check(alpha だが使える)
uv run pytest                 # test

整理すると。

領域20212026
Python インストールpyenvuv
venvpython -m venvuv venv(自動)
依存管理pip + requirements.txtuv + pyproject.toml + uv.lock
Lockpip-tools / poetryuv(内蔵)
Lintflake8(数十秒)ruff(ms)
Formatblack(数秒)ruff format(ms)
Import sortisortruff(統合)
型チェックmypy / pyrightty(alpha)/ pyright / mypy
DataFramePandasPolars / Pandas 3.0
検証dataclasses + 手動Pydantic v2
WebFlask/Django/FastAPIFastAPI/Litestar/Robyn/Django 5
並行asyncio / multiprocessingfree-threaded(3.13+)+ asyncio

一行サマリー: Rust で書き直されたツール群が Python ツールチェーンの半分を入れ替え、Python 自身は GIL を外し始めた。


2章 · Python 3.13(2024-10) — free-threaded preview、JIT preview

Python 3.13 は 2024 年 10 月 7 日にリリースされた。表面的には通常のマイナーバージョンだが、二つが だった。

PEP 703 — free-threaded(no-GIL)ビルド

長く「理論的には可能だが互換性とシングルスレッド性能が壊れる」というのが合意だった。PEP 703(Sam Gross、Meta)はこの合意を破った。核となるアイデア。

ビルドは オプトイン。同じ 3.13 ソースから二つのビルドが出る。

# 標準ビルド(GIL あり)
./configure && make

# free-threaded ビルド(GIL なし)
./configure --disable-gil && make
# インタプリタは python3.13t(t = threaded)

uv ならこう。

uv python install 3.13         # 通常ビルド
uv python install 3.13t        # free-threaded ビルド
uv python install 3.13+freethreaded   # 明示形

3.13 の free-threaded は preview だ。意味:

PEP 744 — Copy-and-Patch JIT(experimental)

同じ 3.13 に入ったもう一つの大きな変化。Tier 2 インタプリタ上の copy-and-patch JIT。ビルド時に LLVM を使って「stencil」と呼ばれる機械語の小片を先に生成し、実行時にパッチして native code を作る。

./configure --enable-experimental-jit && make

3.13 では性能向上は小さい(0〜5%)。だが 3.14、3.15 での本格的な最適化の土台となる。

その他 3.13 の主要変更


3章 · Python 3.14(2025-10) — free-threaded stable

Python 3.14 は 2025 年 10 月 7 日にリリースされた。3.13 で始まった変化の完成形

free-threaded が stable に

3.13 で「experimental」のタグが付いていた free-threaded ビルドが、3.14 では 公式サポートオプション になった。意味は大きい。

deferred imports(PEP 791)

# 3.13 まで — import は即時
import heavy_module   # インタプリタ起動が遅くなる

# 3.14 — deferred import
from __future__ import deferred_imports
import heavy_module   # 実際に使われた時に import

CLI ツールや cold start が重要な環境(Lambda、serverless)で大きい意味を持つ。uv/Ruff のようなツールが速い理由の一つも、このパターンを Rust で真似たもの。

Template strings — t-strings

# f-string は即時評価
name = "world"
greeting = f"Hello, {name}!"   # 即「Hello, world!」

# t-string は lazy template
template = t"Hello, {name}!"   # Template オブジェクト、未評価
# 後でレンダリング、エスケープ、i18n 処理が可能
html = template.render(escape=html_escape)

SQL インジェクション・XSS 対策、i18n、構造化ログなどで有用。2026 年 5 月時点の採用はまだ初期段階。

その他 3.14 の主要変更


4章 · PEP 703 の意味 — GIL を外すと何が変わるか

GIL が消えるとは実際に何を変えるか。手短に。

1) CPU バウンドのマルチスレッドが本当に動く

# 2024 年以前 — GIL のせいで意味なし
from concurrent.futures import ThreadPoolExecutor

def cpu_heavy(n):
    s = 0
    for i in range(n):
        s += i * i
    return s

# スレッドを増やしても単一コアしか使わない
with ThreadPoolExecutor(max_workers=8) as pool:
    list(pool.map(cpu_heavy, [10_000_000] * 8))

free-threaded ビルドでは 8 スレッドが 8 コアに実際に分散する。multiprocessing が必要だった多くのワークロードが ThreadPool で済むようになる(メモリ共有が可能で IPC オーバーヘッドが無いので)。

2) C 拡張の作者の責任が増える

GIL はシングルスレッド前提を強制していた。今後すべての C 拡張はスレッド安全性を自前で保証する必要がある。

numpy、scipy のような巨大パッケージは 1〜2 年かけて段階的に free-threaded 対応した。小さな C 拡張はまだ時間が必要。

3) asyncio との関係

asyncio は単一スレッドのイベントループ。GIL 除去とは別軸の並行性。ただし両者を組み合わせやすくなる。

4) シングルスレッド性能のペナルティ

biased refcount のような機構は不可避的に若干のオーバーヘッドを生む。3.13 で約 15%、3.14 で約 3〜5% に縮小したがゼロではない。CPU バウンドがマルチスレッドで N 倍速くならないワークロードなら標準ビルドが有利な場合もある。

5) エコシステム分岐のリスク

同じ Python 3.14 に二つの ABI が存在することは、パッケージ保守者の負担が倍になることを意味する。小さなライブラリは片方しかサポートできず、ユーザに混乱を与える。この部分は 2027〜2028 年にどう落ち着くかが鍵。


5章 · uv(Astral) — pip / poetry / pipenv を置き換える単一ツール

uv は Astral が 2024 年 2 月に発表した Rust ベースの単一バイナリパッケージマネージャ。Ruff を作った同じ会社。発表当時のスローガンは「An extremely fast Python package installer and resolver」。事実だった。

何を置き換えるか

既存ツールuv が置き換える機能
pipinstall / uninstall
pip-toolsrequirements compile / lock
pipxグローバル CLI ツールインストール
poetryプロジェクト・依存管理
pipenv依存 + venv
pyenvPython インタプリタインストール・管理
virtualenvvenv 作成
twineパッケージビルド/アップロード(uv build、uv publish)

別の言い方で、Python パッケージングのほぼすべての層を一つのバイナリに

インストールと基本使用

# インストール(macOS/Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 新規プロジェクト
uv init my-app
cd my-app
# pyproject.toml、.python-version、README.md を自動生成

# Python インタプリタのインストール
uv python install 3.14

# パッケージ追加
uv add fastapi pydantic 'polars[all]'
uv add --dev pytest ruff

# 同期(venv を lock と正確に一致させる)
uv sync

# 実行
uv run python -m my_app
uv run pytest
uv run ruff check

なぜそんなに速いのか

私のマシンで測った比較(2025 年後半、平均的な FastAPI プロジェクト、約 80 依存)。

操作pippoetryuv
Cold install48s62s2.1s
Warm install12s18s0.4s
Lock 生成n/a24s0.9s

差が大きすぎて、一度使うと戻れない。

pyproject.toml と uv.lock

# pyproject.toml
[project]
name = "my-app"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = [
    "fastapi>=0.115",
    "pydantic>=2.10",
    "polars[all]>=1.0",
]

[tool.uv]
dev-dependencies = [
    "pytest>=8.0",
    "ruff>=0.7",
    "ty>=0.0.1a8",
]

[tool.ruff]
line-length = 100

uv.lock は正確な hash と marker を含む lock ファイル。コミットしてチームで共有する。uv sync は venv を lock に正確に合わせる。

Python インタプリタ管理

uv python list                       # 利用可能なバージョン
uv python install 3.13 3.14 3.14t   # 複数インストール
uv python pin 3.14                  # .python-version を書く

pyenv のしていたことをする。違い: uv は事前ビルドされたインタプリタを直接ダウンロードするので速く、コンパイル依存も不要。

グローバル CLI ツール

uv tool install ruff           # pipx と同じ役割
uv tool install httpie
uv tool run pip-audit          # 一回限りの実行
uvx pip-audit                  # uv tool run のエイリアス

2026 年の標準化の流れ


6章 · Ruff(Astral) — flake8 / black / isort を統合した Rust ツール

Ruff は Astral の最初のプロダクト(2022 年初リリース、2024〜2025 年に爆発的成長)。一言で言えば 「flake8 より 10〜100 倍速く、black/isort/pyupgrade の機能まで吸収した Rust 単一バイナリ」

何を置き換えるか

既存ツールRuff の対応
flake8ruff check
pycodestyleruff check(E ルール)
pyflakesruff check(F ルール)
isortruff check --select I または ruff format
blackruff format
pyupgraderuff check --select UP
autoflakeruff check --fix --select F401
bandit(一部)ruff check --select S
flake8-bugbearruff check --select B
flake8-comprehensionsruff check --select C4
pydocstyleruff check --select D

数百のルールが一つのバイナリに収まり、設定で有効化する。

基本使用

uv add --dev ruff

uv run ruff check .            # lint
uv run ruff check --fix .      # 自動修正
uv run ruff format .           # format(black 互換)
uv run ruff format --check .   # CI で形式検証

pyproject.toml 設定

[tool.ruff]
line-length = 100
target-version = "py313"

[tool.ruff.lint]
select = [
    "E", "F", "W",   # pycodestyle、pyflakes
    "I",             # isort
    "UP",            # pyupgrade
    "B",             # bugbear
    "C4",            # comprehensions
    "SIM",           # simplify
    "RUF",           # ruff specific
]
ignore = ["E501"]    # line too long(formatter が処理)

[tool.ruff.lint.per-file-ignores]
"tests/*" = ["S101"]   # tests 内の assert

[tool.ruff.format]
quote-style = "single"

なぜそんなに速いのか

実ベンチマーク。Django コードベース(約 3500 ファイル)。

ツール時間
flake812.3s
black --check8.1s
isort --check4.5s
pyupgrade6.2s
合計(逐次)31.1s
ruff check + ruff format --check0.4s

数十倍の差。これが CI コストと開発者体感の差を同時に生む。

エディタ統合

Formatter — black 互換 + alpha

ruff format は意図的に black と同じ出力を目標にしている(99% 以上互換)。差異は通常 black のバグか、意図的改善(例えば magic trailing comma 処理)。black を使っていたチームは無損失で移行可能。


7章 · ty(Astral) — Rust で書き直された型チェッカー(alpha)

ty は Astral が 2025 年に alpha で公開した Rust 型チェッカー。mypy/pyright の領域を狙う。2026 年 5 月時点でまだ alpha だが、一部プロジェクトが採用を始めた。

なぜまた別の型チェッカーか

型チェッカー市場はすでに複雑。

ty のポジション。

基本使用

uv add --dev ty

# ディレクトリ検査
uv run ty check src/

# 単一ファイル
uv run ty check src/main.py

# watch モード
uv run ty check --watch src/

2026 年 5 月時点の現実

ty はまだ alpha。意味:

性能は印象的。大きなコードベースで mypy が 5 分かかるものが ty では約 5 秒。定着すればゲームを変える可能性がある。

推奨組み合わせ


8章 · Polars 1.0(2024-08) — Pandas の代替

Polars は Ritchie Vink が 2020 年に始めた Rust ベースの DataFrame ライブラリ。2024 年 8 月に 1.0 が出た。Pandas の単一スレッド、列単位非効率、メモリ膨張問題を正面から狙う。

核となる違い

eager と lazy

import polars as pl

# eager — pandas スタイル
df = pl.read_csv("data.csv")
result = df.filter(pl.col("age") > 30).group_by("city").agg(pl.col("salary").mean())

# lazy — 最適化してから実行
lf = pl.scan_csv("data.csv")    # まだ読まない
result = (
    lf.filter(pl.col("age") > 30)
      .group_by("city")
      .agg(pl.col("salary").mean())
      .collect()                # ここで実行
)

lazy モードではオプティマイザが「フィルタをいつ適用するか」「どの列だけ読むか」を決めて、ディスク I/O とメモリを大きく削減する。

Pandas との性能比較

H2O.ai の DataFrame ベンチマーク(group-by、join、5 GB)。

ライブラリgroup-byjoin
Pandas 2.x95sOOM
Pandas 3.0(PyArrow)41s220s
Polars 1.0(eager)12s38s
Polars 1.0(lazy)6.8s22s

特に join やメモリ限界近くで差が大きい。

いつ Polars、いつ Pandas

Polars:

Pandas:

Pandas との interop

df_pl = pl.from_pandas(df_pd)
df_pd = df_pl.to_pandas()        # PyArrow なら zero-copy
arr = df_pl.to_arrow()           # Arrow Table
df_pl2 = pl.from_arrow(arr)

Arrow を通じた zero-copy interop がどんどん標準化されており、二つを混ぜて使うのは負担が少ない。


9章 · Pandas 3.0(2025-05) — カムバック

Pandas は死んでいない。2025 年 5 月に出た 3.0 は最大のメジャー更新。

3.0 の大きな変化

  1. Apache Arrow がデフォルト backend に — numpy backend は非推奨経路。
  2. Copy-on-Write がデフォルト — メモリ使用量と安全性を同時に改善。
  3. PyArrow が必須依存 — もはや optional ではない。
  4. string dtype のデフォルト化 — Python object の代わりに pyarrow string。
  5. inplace メソッドの多くが削除 — CoW と衝突。
  6. Python 3.10+ 必須

Copy-on-Write の意味

import pandas as pd
df1 = pd.DataFrame({"a": [1, 2, 3]})
df2 = df1   # 別名

df2.loc[0, "a"] = 999

# 2.x: df1 の値も 999 になる(SettingWithCopyWarning)
# 3.0: df1 は変わらない(CoW で分岐)

長く Pandas ユーザを悩ませた SettingWithCopyWarning の終焉。ただし inplace 動作に依存していたコードは全部壊れる。マイグレーションガイドを読みつつ。

性能

Arrow backend のおかげで、文字列処理、group-by、一部 join が 2.x 比 2〜5 倍速くなった。Polars ほどではないが差は縮まった。


10章 · Pydantic v2.10 — データ検証の事実上の標準

Pydantic は v1 までは純 Python だったが、v2(2023)から Rust コアで書き直された。v2.10(2025 年後半)は v2 系の安定化バージョン。

何をするか

基本例

from pydantic import BaseModel, Field, EmailStr
from datetime import datetime

class User(BaseModel):
    id: int
    name: str = Field(min_length=1, max_length=64)
    email: EmailStr
    created_at: datetime
    tags: list[str] = []

# 検証 + 変換
u = User.model_validate({
    "id": "42",                       # str → int 自動
    "name": "Alice",
    "email": "alice@example.com",
    "created_at": "2026-05-16T10:00:00Z",
})

print(u.model_dump_json())

v2 の性能

Rust コアのおかげで v1 比 5〜50 倍速い(スキーマの複雑さによる)。FastAPI のようなフレームワークで P99 latency が目に見えて改善した。

Pydantic Settings

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    database_url: str
    redis_url: str = "redis://localhost"
    log_level: str = "INFO"

    class Config:
        env_file = ".env"

settings = Settings()

12-factor app の config パターンをきれいにする。

LLM ツールでの活用

OpenAI/Anthropic の structured output、function calling が Pydantic モデルから schema を受け取って enforce する。LangChain、LlamaIndex、Pydantic AI などの基本アダプタも Pydantic。

from pydantic import BaseModel
from anthropic import Anthropic

class SearchQuery(BaseModel):
    query: str
    max_results: int = 10

# Anthropic SDK が schema を抽出して tool definition に変換
client = Anthropic()

11章 · ウェブフレームワーク — FastAPI / Litestar / Robyn / Quart / Sanic / BlackSheep

2026 年の Python ウェブフレームワーク市場はかつてないほど多元化している。各々の強みが異なる。

FastAPI

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/")
async def create_item(item: Item) -> dict:
    return {"id": 1, **item.model_dump()}

Litestar(旧 Starlite)

from litestar import Litestar, post
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float

@post("/items/")
async def create_item(data: Item) -> dict:
    return {"id": 1, **data.model_dump()}

app = Litestar([create_item])

Robyn

from robyn import Robyn

app = Robyn(__file__)

@app.get("/")
async def hello():
    return "hello, world"

app.start(port=8080)

Quart

Sanic

BlackSheep

選択ガイド


12章 · Django 5.x — フルスタッククラシックの堅牢さ

Django は 2005 年からの大人。2026 年でも Python フルスタックの代表。

Django 5.x の大きな変化

核は async サポートが段階的に成熟中 ということ。ORM の async は 5.2 で一部 stable、全体は 6.0(2026 年末予定)で完成予定。

いつ Django

いつ使わないか

Django Ninja — 同じ ORM、FastAPI スタイル API

from ninja import NinjaAPI
from pydantic import BaseModel

api = NinjaAPI()

class ItemIn(BaseModel):
    name: str
    price: float

@api.post("/items/")
def create_item(request, item: ItemIn):
    return {"id": 1, **item.dict()}

Django の ORM/auth/admin を維持しつつ FastAPI スタイルの API を使いたい時に良い答え。


13章 · パッケージング — uv / Briefcase / Nuitka / PyInstaller

配布形態によってツールが違う。

ライブラリパッケージング — uv build / hatchling

uv build               # sdist + wheel を生成
uv publish             # PyPI アップロード(twine 代替)

内部で hatchling のような PEP 517 ビルドバックエンドを呼ぶ。setup.py は事実上終わった。

単一実行ファイル — PyInstaller / Nuitka

PyInstaller:

uv tool install pyinstaller
pyinstaller --onefile my_app.py
# dist/my_app

利点: ほぼすべてのライブラリと互換。欠点: 大きなバイナリ、AV 誤検知、遅い起動。

Nuitka:

uv add --dev nuitka
python -m nuitka --standalone --onefile my_app.py

利点: Python コードを実際の C にコンパイルするので速くて小さい。欠点: ビルド遅い、一部の動的 import に弱い。

デスクトップ/モバイル — Briefcase(BeeWare)

Python コードを native iOS/Android/macOS/Windows アプリとしてパッケージ化。

uv tool install briefcase
briefcase new
briefcase create iOS
briefcase build iOS
briefcase run iOS

Python 3.13 の iOS/Android Tier 3 サポートと組み合わせて、モバイルで Python を動かすシナリオが現実的になった。

その他


14章 · クラウド — Modal / Replicate / Pyodide

import modal

app = modal.App("ml-job")

@app.function(gpu="A100", timeout=600)
def train(epochs: int):
    import torch
    # 学習コード
    return "done"

if __name__ == "__main__":
    with app.run():
        train.remote(epochs=10)

Replicate

Pyodide


15章 · 韓国 / 日本の Python 活用

韓国

スタートアップトレンド: FastAPI + Polars + uv の組み合わせが急速に標準化中。データ職はほぼ Python 一色。

日本

日本は伝統的に Ruby 比重が高かったが、データ・ML 領域で Python への移行が強い。


16章 · 誰が何を選ぶか

状況別の推奨スタック。

データ分析/サイエンス

ML/AI 学習ワークロード

ウェブバックエンド(マイクロサービス)

ウェブバックエンド(モノリス + admin)

CLI ツール

デスクトップ/モバイル

組み込み


17章 · 移行チェックリスト — 既存プロジェクトを 2026 スタイルへ

既存の Python プロジェクトがあるなら、どう移すか。

ステップ 1 — uv 導入(リスク低)

# pyproject.toml が既にあるなら
uv lock              # uv.lock を生成
uv sync              # venv を生成/同期

# requirements.txt ベースなら
uv add -r requirements.txt

既存ワークフローと並行可能。CI で uv sync && uv run pytest に段階的に切り替え。

ステップ 2 — Ruff 導入(リスク低)

uv add --dev ruff
# 最初は lint だけ、format は black を維持しながら比較
uv run ruff check --select F,E .
# 慣れたらルールを拡張し、format も ruff に

ステップ 3 — Pydantic v1 → v2(中リスク)

API が大きく変わる。変換ツールを使う。

uv tool install bump-pydantic
bump-pydantic src/

ステップ 4 — Pandas → Polars(オプション、大作業)

全面移行より hot path だけ選別。interop がスムーズなので段階的に可能。

ステップ 5 — Python 3.13/3.14 にアップグレード

uv python install 3.14
uv python pin 3.14
uv sync
uv run pytest

free-threaded ビルドは別途検討。C 拡張互換を確認して。

ステップ 6 — 型チェッカー

mypy を使っているなら維持しつつ、ty を CI 補助ゲートとして追加。


18章 · よくある落とし穴とベストプラクティス


19章 · 未来 — 2027〜2028 年展望


20章 · まとめ — 二つの変曲点が生んだ新しい Python

2026 年の Python は二つの大きな出来事の交差点に立っている。

  1. 言語自体が GIL を外し始めた(PEP 703、3.13 preview → 3.14 stable)。30 年で最大のランタイム変化。CPU バウンドスレッディングが本当に可能になり、asyncio との組み合わせがきれいになる。ただし C 拡張エコシステムが適応するのにあと 2〜3 年かかる。

  2. Astral がツールチェーンの半分を Rust で入れ替えた(uv、Ruff、ty)。pip/poetry/flake8/black/isort/mypy が一社のツール 2〜3 個に統合されつつある。速度が 10〜100 倍になり、CI コストと開発者体感が同時に改善した。

加えて Pydantic v2 の Rust コア、Polars の Apache Arrow、FastAPI/Litestar/Robyn の ASGI エコシステム多元化、Pandas 3.0 の Arrow backend 吸収、Django 5.x の async 段階的成熟 — すべての層が同時に動いている。

5 年前の Python コードを見たことがあるなら、2026 年のモダン Python プロジェクトは外観上はほぼ同じに見えるが、その下のツール・ランタイム・データ処理方式がほぼ全部変わった。移行の良い点は、一度にやる必要がないこと。uv 導入 → Ruff 導入 → Pydantic v2 → Polars hot path → Python 3.14 → free-threaded(必要な時のみ)の順で段階的に移せばよい。

Python は 30 年を超えたが、今が他のどの時期よりも速く変わっている時期だ。追いかける甲斐のある変化だ。


参考 / References

コメント

まだコメントはありません。

ログインするとコメントできます