Python 3.15 アップグレード手順:uv でインストール、遅延インポート (lazy import) の使い方、pandas・PyTorch の対応状況
更新日

結論から: Python 3.15.0 は 2026年10月9日にリリースされました。uv (opens in a new tab) を使っているなら、先に uv を更新してからインストールします。
uv self update
uv python install 3.15大事なプロジェクトを移行する前に、テスト用のプロジェクトを作り、実際の依存パッケージを入れてみましょう。
uv init --python 3.15 py315-test
cd py315-test
uv add numpy pandas scikit-learn matplotlib主要な科学計算ライブラリは、現時点でビルド済みの wheel からインストールできます。PyTorch と TensorFlow はまだ入りません。 DuckDB はソースからのビルドになります。これらに依存するプロジェクトは、当面 3.14 のままにしてください(uv python pin 3.14)。
アップグレードする価値がある機能は遅延インポートです。lazy import pandas as pd とキーワードを1つ足すだけで、テスト用スクリプトの --help の実行時間が 2.7 秒から 0.01 秒になりました。
検証環境: 以下で「検証済み」とある内容は、2026年10月11日に Apple M4 Max(macOS)上で、uv 0.13.0 と
uv python installで入れた CPython 3.15.0 / 3.15.0t を使って実行したものです。Windows と Linux での挙動、python.org のインストーラー、pyenv、conda については公式ドキュメントに基づく情報で、実際には試していません。
3.15 で実際に気づく変更点
変更履歴は長いですが、データ処理のスクリプトや CLI を書く人が実際に出会うのは次の5つです。
| 変更 | 影響 | 対応 |
|---|---|---|
| 遅延インポート(PEP 810) | lazy import x で、最初に使うまで読み込みを遅らせられる | CLI、スクリプト、起動の遅いアプリで使う |
| UTF-8 がデフォルトのエンコーディングに(PEP 686) | open("file.txt") がどの OS でも UTF-8 で読み書きする | cp1252 / cp932 / GBK のファイルを扱う Windows ユーザーは encoding= を明示する |
| uv 0.13 のデフォルトが 3.15 に | バージョン指定のない新しい uv プロジェクトは自動で 3.15 になる | 依存パッケージが未対応なら 3.14 に固定する |
| フリースレッド版が stable ABI に対応(PEP 803) | python3.15t はスレッドを並列実行できるが、対応する stable ABI の wheel を出しているパッケージはまだ少ない | 3.15t ではソースビルドになる前提で考える |
組み込みの frozendict、sentinel、profiling パッケージ | 新しい組み込み型と、サンプリングプロファイラー Tachyon | 任意。使わなくても何も壊れない |
全体の一覧は 公式の What's New in Python 3.15 (opens in a new tab) にあります。このガイドでは、インストール、互換性の確認、遅延インポートの使い方、エンコーディング変更への対応、フリースレッド版を使うかどうかの判断という作業に絞って説明します。
- Python 3.15 アップグレード手順:uv でインストール、遅延インポート (lazy import) の使い方、pandas・PyTorch の対応状況
- Claude Code Mods 入門:最初の Mod の作り方・テスト・導入手順と、コミュニティ実例 15 選
- Laya の使い方:pandas でテキスト分類(Jev のオープンソース代替を4言語で実測)
- Claude Code が AGENTS.md を読むように:設定方法、4つの読み込みモード、Codex・OpenCode・Cursor との共用
- GPT Image 2.5の使い方:FlareとSunburstの違い・API料金
- DeepSeek Harness の使い方:インストール、初期設定、最初のエージェント実行まで
- Runcell Science:Claude Scienceのオープンソース代替となるAI研究ワークスペース
- Macをスリープさせない方法:Codex・Claude Codeを止めずに動かす
- OpenClaw vs ZeroClaw vs Pi Agent vs Nanobot: 2026年に選ぶべきAIエージェントスタックは?
- Claude CodeでJupyterノートブックを分析する方法|Data Science向けの実践ポイントと限界
- Claude Code Routinesとは?AIエージェントの定期実行と自動化を理解する
- Claude Code DesktopでBypass permissionsを有効にする方法
- GoogleのA2Aプロトコルで2つのPythonエージェントを構築する方法 - ステップバイステップチュートリアル
- 2025年のPythonで人気のあるトップ10のデータ可視化ライブラリ
ステップ1:Python 3.15 をインストールする
uv を使う(検証済み)
インストールの前に uv を更新してください。 今週いちばんやりがちなミスがこれです。古い uv はアルファ版しか知りません。手元に入っていた uv 0.9.25 では、uv python list 3.15 に cpython-3.15.0a4 しか表示されませんでした。この状態で uv python install 3.15 を実行すると、正式版ではなくアルファ版が入ります。
uv self update # needs 0.13.0 or newer
uv --version
uv python install 3.15uv 0.13.0 では、通常版とフリースレッド版の両方が 24.8 秒でインストールできました。
uv python install 3.15 3.15tInstalled 2 versions in 24.83s
+ cpython-3.15.0+freethreaded-macos-aarch64-none (python3.15t)
+ cpython-3.15.0-macos-aarch64-none (python3.15)uv を Homebrew、pip、pipx で入れた場合、uv self update は使えません。入れたときと同じ方法で更新します(brew upgrade uv、pipx upgrade uv)。
uv 0.13 ではデフォルトも変わります。uv 0.13.0 のリリースノート (opens in a new tab) によると、バージョンを指定しない uv python install は 3.15 をダウンロードするようになりました。新しく uv venv や uvx python を実行したときも、互換性のある Python が入っていなければ 3.15 がダウンロードされます。すでにインストール済みの Python はそのまま使われます。プロジェクトを 3.14 に留めたい場合は、次のように記録しておきます。
uv python pin 3.14これで .python-version が作られ、そのフォルダで uv を実行するたびに読み込まれます。
その他の方法(公式ドキュメントより、未検証)
- python.org のインストーラー(Windows、macOS):python.org/downloads (opens in a new tab) から 3.15.0 をダウンロードします。リリースノートによると、公式の macOS インストーラーはフリースレッド対応をデフォルトで入れるようになり、Windows の 64 ビット版バイナリは新しい tail-calling インタープリターを使います。
- pyenv:
pyenv updateのあとpyenv install 3.15.0を実行します。お使いの pyenv に 3.15.0 が表示されるまで待ってください。 - conda:conda-forge で公開されたら、
python=3.15で環境を作ります。移行計画を立てる前に公開状況を確認してください。
OS ごとの Python バージョン切り替え全般については、以前の Python のアップグレード方法 と Python バージョンマネージャーの解説 が今も使えます。このページでは 3.15 固有の内容を扱います。
ステップ2:パッケージがインストールできるか確認する
今日アップグレードできるかどうかは、このステップで決まります。クリーンな 3.15 プロジェクトを作って一般的なデータサイエンス用のパッケージを入れ、よく質問されるパッケージについては PyPI も確認しました。
互換性の一覧(2026年10月11日に検証)
| パッケージ(バージョン) | Python 3.15 | Python 3.15t(フリースレッド) | 備考 |
|---|---|---|---|
| numpy 2.5.4 | Wheel | Wheel | |
| pandas 3.0.6 | Wheel | Wheel | |
| scipy 1.18.1 | Wheel | Wheel | |
| scikit-learn 1.9.1 | Wheel | Wheel | |
| matplotlib 3.11.2 | Wheel | Wheel | |
| pyarrow 26.0.0 | Wheel | Wheel | |
| polars 2.0.0 | Wheel (abi3) | ソースからビルド | ランタイムが cp310-abi3 の wheel しか出しておらず、フリースレッド版では使えない。Rust のビルドに 6分51秒かかった |
| ipykernel 9.17.1 (pyzmq, psutil, debugpy) | Wheel | 未検証 | Jupyter カーネルは 3.15 で動く |
| duckdb 1.5.6 | ソースからビルド | 未検証 | wheel は cp314 まで。C++ のビルドに約2分半かかった |
| pygwalker 0.5.0.1 | 動作する | 未検証 | duckdb に依存するため、ソースビルドも引き継ぐ |
| torch 2.14.1 | インストール不可 | インストール不可 | wheel は cp310 から cp314 と cp314t のみ |
| tensorflow 2.21.0 | インストール不可 | インストール不可 | wheel は cp310 から cp313 のみ |
numpy、pandas、scipy、scikit-learn、matplotlib、pyarrow、polars のインストールは、3.15 ではダウンロード込みで 71 秒でした。コンパイルは発生していません。同じ組み合わせを 3.15t で入れると 6分51秒かかり、そのほとんどが Polars のコンパイルでした。
wheel がないパッケージについては、uv が理由をはっきり表示します。3.15 で PyTorch を入れようとすると次のようになります。
hint: You require CPython 3.15 (`cp315`), but we only found wheels for `torch`
(v2.14.1) with the following Python ABI tags: `cp310`, `cp311`, `cp312`, `cp313`, `cp314`, `cp314t`自分のプロジェクトを1分で確認する
確認のために何かをインストールする必要はありません。3.15 の環境に対してドライランを実行します。
uv venv --python 3.15 .venv315
uv pip install --dry-run --python .venv315/bin/python -r requirements.txt依存関係が解決できれば問題ありません。上の cp315 のヒントが出たら、そのパッケージがアップグレードの障害です。
ソースビルドは失敗ではありませんが、時間がかかり、コンパイラーも必要です(Polars なら Rust、DuckDB なら C++)。CI では、1分で終わるジョブが10分かかるようになることもあります。wheel が出るまで、CI は 3.14 に固定しておきましょう。
ステップ3:遅延インポートでスクリプトの起動を速くする
3.15 に移る一番の理由は遅延インポートだと思います。解決してくれる問題は、多くの人に覚えがあるはずです。
コマンドラインのスクリプトは、たいてい先頭ですべてを import します。そのため my_tool.py --help を実行しただけでも、使いもしない pandas、matplotlib、scikit-learn の読み込みコストをまるごと払うことになります。
変更前と変更後(検証済み)
通常の(即時に読み込む)バージョンです。
import sys
import pandas as pd
import matplotlib.pyplot as plt
import sklearn.linear_model
if len(sys.argv) > 1 and sys.argv[1] == "--help":
print("usage: tool [--help] file.csv")
sys.exit(0)遅延インポート版は lazy キーワードを足すだけです。
import sys
lazy import pandas as pd
lazy import matplotlib.pyplot as plt
lazy from sklearn import linear_model
if len(sys.argv) > 1 and sys.argv[1] == "--help":
print("usage: tool [--help] file.csv")
sys.exit(0)
df = pd.DataFrame({"x": [1, 2, 3], "y": [2, 4, 6]})
model = linear_model.LinearRegression().fit(df[["x"]], df["y"])
print(model.coef_)手元のマシンで python script.py --help をそれぞれ5回実行した結果です。
| バージョン | 時間 | -X importtime の行数 |
|---|---|---|
| 通常の import | 2.69 to 2.74 s | 1,747 |
lazy import | 0.01 s | 27 |
処理をすべて通す経路も問題なく動きます。遅延インポート版で回帰モデルを学習させると 2.0 が出力されました。pandas は pd を最初に使った行で読み込まれます。
絶対値は環境によって変わります。この環境では import sklearn.linear_model だけで 2.2 秒、import pandas で 0.86 秒かかりました。重いライブラリに触れない分岐があるプログラムなら、同じ傾向になります。
遅延インポートの中身を確認する
遅延された名前は、使われるまではプロキシです。実際に確認できます。
import sys
lazy import json
print(type(globals()["json"])) # <class 'lazy_import'>
print("json" in sys.modules) # False
json.dumps(1)
print(type(globals()["json"]), "json" in sys.modules) # <class 'module'> Trueそもそもどの import が遅いのかを調べるには、python -X importtime your_script.py 2> imports.log を実行し、2列目で並べ替えます。
lazy が SyntaxError になる3つの場所(検証済み)
lazy はモジュールのトップレベルでしか使えません。次の3つのエラーはすべて実際に発生しました。
| 場所 | エラーメッセージ |
|---|---|
| 関数の中 | SyntaxError: lazy import not allowed inside functions |
try / except の中 | SyntaxError: lazy import not allowed inside try/except blocks |
| スターインポート | SyntaxError: lazy from ... import * is not allowed |
一番影響が大きいのは try/except の制限です。try: import ujson as json except ImportError: import json のようなコードは遅延インポートにできません。フォールバック部分は通常の import のままにするか、小さなモジュールに切り出して、そのモジュールを遅延インポートします。
公式ドキュメントによると、クラス本体の中と from __future__ の import も遅延にはできません。
エラーは最初に使った時点に移る
存在しないモジュールでも、ファイルの先頭ではエラーになりません。
lazy import not_a_real_module
print("defined ok") # this prints
not_a_real_module.x # ModuleNotFoundError is raised hereオプションの依存パッケージには便利です。一方で、import 名のタイプミスが、めったに通らないコードパスを実行するまで見つからないこともあります。遅延インポートしたモジュールを実際に使うテストを、少なくとも1つは用意しておきましょう。
コードを変えずにすべてを遅延にする
コマンドラインから、プログラム全体を遅延インポートに切り替えることもできます。
python -X lazy_imports=all my_tool.py --help
# or
PYTHON_LAZY_IMPORTS=all python my_tool.py --helpこの方法で、手を加えていない通常版のスクリプトも 0.01 秒になりました。ただし、import 時に処理を行うモジュールには注意が必要です。import されると print して自分を登録する小さなプラグインモジュールを作って試したところ、lazy_imports=all では登録処理が一度も実行されませんでした。プログラムがそのモジュール名に一度も触れなかったためです。
normal: plugin registered / main done
all: main done読み込み(import)時にプラグイン、コーデック、matplotlib のバックエンドなどを登録するライブラリは、同じ理由で壊れる可能性があります。=all は効果の見積もりに使い、実際には安全とわかっている import にだけ手で lazy を付けてください。より細かく制御したい場合は、ドキュメントにある sys.set_lazy_imports_filter() を使います。
1つのファイルで 3.14 と 3.15 の両方に対応する
lazy キーワードは 3.14 以前では構文エラーになります。両方で動かす必要があるコードでは、代わりにモジュールレベルの __lazy_modules__ リストを使います。古いバージョンはこれを無視し、3.15 ではここに書いたモジュールの import が遅延になります。
__lazy_modules__ = ["pandas"]
import sys
import pandas as pd # lazy on 3.15, eager on 3.14
print("pandas" in sys.modules) # False on 3.15 until pd is usedこのパターンで、3.15 では pandas が sys.modules に入らないままであることを確認しました。
ステップ4:UTF-8 デフォルト化に対応する
3.15 では、encoding 引数なしの open() がすべてのプラットフォームで UTF-8 を使います。デフォルトで sys.flags.utf8_mode == 1、PYTHONUTF8=0 を設定すると 0 になることを確認しました。
macOS と Linux ではほとんど何も変わりません。影響が大きいのは Windows です。エンコーディングを指定せずに古い形式のファイルを読むコードは、挙動が変わります。日本語環境で特に多いのが、Excel から書き出した Shift-JIS(cp932)の CSV です。ほかにも cp1252 の CSV や中国語の GBK ファイルが該当します。こうしたファイルの読み込みで UnicodeDecodeError が出たり、文字化けしたりする可能性があります。
対策は、エンコーディングを明示することです。
import pandas as pd
df = pd.read_csv("export.csv", encoding="cp932") # Japanese Excel export
with open("legacy.txt", encoding="locale") as f: # old behavior: system locale
text = f.read()アップグレード前に影響を受けるコードを探すには、今の Python で -X warn_default_encoding を付けてテストを実行します。一時的に以前の挙動に戻したい場合は、PYTHONUTF8=0 を設定します。
ステップ5:フリースレッド版(3.15t)を使うか決める
フリースレッド版の Python には GIL がないため、純粋な Python のスレッドが複数の CPU コアを使えます。CPU を使うループを4回、まず逐次で、次に4スレッドで実行しました。
| ビルド | 逐次 | 4スレッド | 高速化 |
|---|---|---|---|
| Python 3.15 | 0.72 s | 0.71 s | 1.0× |
| Python 3.15t | 0.65 s | 0.19 s | 3.4× |
numpy、pandas、scikit-learn、polars、matplotlib、pyarrow を import したあとも GIL は無効のままでした(sys._is_gil_enabled() は False を返しました)。
CPU 負荷の高い純粋な Python のコードをスレッドで動かしていて、依存パッケージに cp315t の wheel があるなら、3.15t を使う価値があります。Polars、DuckDB、ディープラーニング系のライブラリに依存しているなら見送りましょう。重い処理がすでに NumPy や pandas の内部で動いている場合も同様です。これらは自分で GIL を解放するからです。
今アップグレードすべきか
| 状況 | おすすめ |
|---|---|
| numpy / pandas / sklearn を使うスクリプト、CLI、自動化 | アップグレードする。 遅延インポートの効果ははっきり出る |
| 分析用の Jupyter ノートブック | 新しい環境でアップグレードし、古いカーネルは数週間残しておく |
| PyTorch や TensorFlow のプロジェクト | 3.14 のままにする(uv python pin 3.14) |
| CI で DuckDB を使う、または 3.15t で Polars を使う | wheel が出るのを待つか、コンパイル時間と CI 上のコンパイラーを受け入れる |
| 古いエンコーディングのファイルを読む Windows のコード | 先に encoding= を明示してから、アップグレードする |
Jupyter で 3.15 を使う
ipykernel は 3.15 でインストールでき、動作します。uv プロジェクトから 3.15 のカーネルを登録するには次のようにします。
uv add ipykernel
uv run python -m ipykernel install --user --name py315 --display-name "Python 3.15"ノートブックで作業しているなら、RunCell (opens in a new tab) は Jupyter の中で動く AI エージェントなので、実行中のカーネルの状態を把握できます。既存のノートブックが新しいカーネルでも動くかを試すときに役立ちます。PyGWalker (opens in a new tab) も 3.15 で動作します(検証済み:pyg.to_html() で DataFrame を描画できました)。ただし上で触れた DuckDB のコンパイルが発生します。
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
uv python install 3.15 で 3.15.0a4 が入る | uv が 0.13 より古い | uv self update、または Homebrew / pipx で更新する |
No solution found … no wheels with a matching Python ABI tag (cp315) | パッケージに 3.15 用の wheel がまだない(torch、tensorflow) | そのプロジェクトで uv python pin 3.14 |
| duckdb や polars-runtime のインストールが何分も止まったように見える | 対応する wheel がなく、ソースからビルドしている | 終わるまで待つ(C++ または Rust のコンパイラーが必要)。または 3.15t ではなく 3.14 か通常の 3.15 を使う |
SyntaxError: lazy import not allowed … | 関数、try、クラスの中で lazy を使っている | import をモジュールのトップレベルに移すか、通常の import にする |
| プラグインやバックエンドが登録されなくなった | -X lazy_imports=all が副作用のある import を飛ばした | =all をやめ、選んだ import にだけ lazy を付ける |
アップグレード後、Windows で UnicodeDecodeError が出る | UTF-8 がデフォルトのエンコーディングになった | encoding="cp1252" / "cp932" / "gbk" か encoding="locale" を指定する |
| 新しい uv プロジェクトが意図せず 3.15 になる | uv 0.13 でデフォルトが変わった | uv python pin 3.14 |
依存パッケージから SyntaxWarning: 'return' in a 'finally' block が出る | 新しい Python が、ライブラリ内の古い書き方を警告している | 無害。自分のコードではなくライブラリ側の警告 |
よくある質問
Python 3.15 はいつリリースされましたか? Python 3.15.0 は 2026年10月9日にリリースされました。
uv で Python 3.15 をインストールするには? uv を 0.13.0 以降に更新してから uv python install 3.15 を実行します。古い uv は 3.15 のアルファ版しか認識しません。
pandas は Python 3.15 で動きますか? 動きます。pandas 3.0.6 は cp315 と cp315t の wheel を提供しています。numpy、scipy、scikit-learn、matplotlib、pyarrow も同様です。
PyTorch は Python 3.15 に対応していますか? まだです。2026年10月11日時点で torch 2.14.1 の wheel は cp314 と cp314t までしかなく、3.15 にはインストールできません。
Python 3.15 の遅延インポートとは何ですか? lazy import module と書くと、Python は軽量なプロキシを作り、その名前が最初に使われたときにモジュールを読み込みます。モジュールを使わないコードパスでは起動時間が短くなります。
遅延インポートを使いつつ Python 3.14 にも対応できますか? できます。モジュールの先頭で __lazy_modules__ = ["module_name"] を定義します。Python 3.15 ではその import が遅延になり、古いバージョンではこのリストは無視されます。
プロジェクトを Python 3.14 のままにするには? プロジェクトのフォルダで uv python pin 3.14 を実行します。uv が参照する .python-version ファイルが作られます。
関連ガイド
- Windows、Mac、Linux、仮想環境での Python のアップグレード方法
- Python バージョンマネージャー pyenv の使い方
- Python のバージョンを確認する方法
- Python パッケージのアップグレード方法
- Polars と pandas の比較
- Python の循環インポート(circular import)の直し方