Skip to content

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

更新日

Python 3.15 を uv のコマンド1つでインストールし、numpy・pandas・PyTorch・DuckDB・Polars が実際に入るかを確認します。macOS で実測した wheel 対応表、スクリプトの起動を 2.7 秒から 0.01 秒に縮めた遅延インポート、lazy import が SyntaxError になる3つの場所、UTF-8 デフォルト化で cp932 ファイルが読めなくなる問題、フリースレッド版まで解説します。

結論から: 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) にあります。このガイドでは、インストール、互換性の確認、遅延インポートの使い方、エンコーディング変更への対応、フリースレッド版を使うかどうかの判断という作業に絞って説明します。

ステップ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.15

uv 0.13.0 では、通常版とフリースレッド版の両方が 24.8 秒でインストールできました。

uv python install 3.15 3.15t
Installed 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.15Python 3.15t(フリースレッド)備考
numpy 2.5.4WheelWheel
pandas 3.0.6WheelWheel
scipy 1.18.1WheelWheel
scikit-learn 1.9.1WheelWheel
matplotlib 3.11.2WheelWheel
pyarrow 26.0.0WheelWheel
polars 2.0.0Wheel (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 の行数
通常の import2.69 to 2.74 s1,747
lazy import0.01 s27

処理をすべて通す経路も問題なく動きます。遅延インポート版で回帰モデルを学習させると 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.150.72 s0.71 s1.0×
Python 3.15t0.65 s0.19 s3.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 ファイルが作られます。

関連ガイド