1728890491
2024-10-09 09:33:00
この記事では、Python 3.12 と比較した Python 3.13 の新機能について説明します。 Python 3.13 は 2024 年 10 月 7 日にリリースされました。詳細については、 変更履歴。
概要 – リリースのハイライト
Python 3.13 は、Python プログラミング言語の最新の安定リリースであり、言語、実装、標準ライブラリにさまざまな変更が加えられています。最大の変更点には、新しい機能が含まれます。 対話型通訳者、での実行の実験的なサポート フリースレッドモード (PEP 703)、そして ジャストインタイムコンパイラ (PEP 744)。
エラー メッセージは引き続き改善され、デフォルトでトレースバックが色で強調表示されるようになりました。の locals() 組み込みには現在あります 定義されたセマンティクス 返されたマッピングを変更できるようになり、型パラメータがデフォルト値をサポートするようになりました。
ライブラリの変更には、廃止予定の API とモジュールの削除に加え、使いやすさと正確さの通常の改善が含まれています。いくつかの従来の標準ライブラリ モジュールには、 削除されました Python 3.11 での非推奨を受けて (PEP 594)。
この記事は、すべての新機能の完全な仕様を提供するものではなく、便利な概要を提供するものです。詳細については、次のドキュメントを参照してください。 ライブラリリファレンス
そして 言語リファレンス。完全な実装と変更の設計理論的根拠を理解するには、特定の新機能の PEP を参照してください。ただし、機能が完全に実装されると、PEP は通常、最新の状態に保たれないことに注意してください。見る Python 3.13 への移植 以前のバージョンの Python からアップグレードするためのガイダンスについては、こちらを参照してください。
インタプリタの改善:
Python データ モデルの改善:
標準ライブラリの大幅な改善:
セキュリティの改善:
C API の改善:
-
の
Py_mod_gilスロットは、拡張モジュールが実行をサポートしていることを示すために使用されるようになりました。 ギル 無効。 -
の PyTime C API が追加され、システム クロックへのアクセスが可能になりました。
-
PyMutexは、1 バイトを占有する新しい軽量ミューテックスです。 -
新しいものがあります 一連の関数
生成するための PEP669 C API でのイベントの監視。
新しい入力機能:
プラットフォームのサポート:
重要な削除:
-
PEP 594: 残り 19 個の「切れたバッテリー」(レガシー stdlib モジュール) は標準ライブラリから削除されました。
aifc、audioop、cgi、cgitb、chunk、
crypt、imghdr、mailcap、msilib、nis、
nntplib、ossaudiodev、pipes、sndhdr、
spwd、sunau、telnetlib、uuそしてxdrlib。 -
を削除します。 2対3 ツールと
lib2to3モジュール (Python 3.11 では非推奨)。 -
を削除します。
tkinter.tixモジュール (Python 3.6 では非推奨)。 -
を削除します。
locale.resetlocale()関数。 -
を削除します。
typing.ioそしてtyping.re名前空間。 -
連鎖を削除する
classmethod記述子。
リリーススケジュールの変更:
PEP602 (「Python の年次リリース サイクル」) が更新され、新しいリリースの完全サポート (「バグ修正」) 期間が 2 年間に延長されました。この更新されたポリシーは次のことを意味します。
-
Python 3.9 ~ 3.12 には 1 年半の完全サポートがあり、その後 3 年半のセキュリティ修正が行われます。
-
Python 3.13 以降には 2 年間の完全サポートがあり、その後 3 年間のセキュリティ修正が提供されます。
新機能
より優れた対話型通訳者
Python は新しいものを使用するようになりました。 相互の作用 デフォルトでは、シェルのコードに基づいて、 PyPyプロジェクト。ユーザーが起動すると、 REPL 対話型端末から、次の新機能がサポートされるようになりました。
-
履歴を保存した複数行の編集。
-
次のような REPL 固有のコマンドの直接サポート ヘルプ、 出口、 そして やめる関数として呼び出す必要はありません。
-
プロンプトとトレースバック 色はデフォルトで有効になっています。
-
を使用した対話型ヘルプの閲覧 F1 別のコマンド履歴を使用します。
-
「貼り付けモード」 F3 これにより、大きなコード ブロックを簡単に貼り付けることができます ( F3 もう一度押すと通常のプロンプトに戻ります)。
新しい対話型シェルを無効にするには、 PYTHON_BASIC_REPL 環境変数。インタラクティブ モードの詳細については、を参照してください。 インタラクティブモード。
(Pablo Galindo Salgado、Łukasz Langa、Lysandros Nikolaou による寄稿: gh-111201 PyPy プロジェクトのコードに基づいています。 Windows サポートは Dino Viehland と Anthony Shaw によって提供されました)。
エラーメッセージの改善
-
よくある間違いは、標準ライブラリ モジュールと同じ名前のスクリプトを作成することです。これによりエラーが発生した場合、より役立つエラー メッセージが表示されるようになりました。
$ python random.py Traceback (most recent call last): File "/home/me/random.py", line 1, in
import random File "/home/me/random.py", line 3, in print(random.randint(5)) ^^^^^^^^^^^^^^ AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and the import system gives it precedence) 同様に、スクリプトがインポートしようとしているサードパーティ モジュールと同じ名前を持っていてエラーが発生した場合も、より役立つエラー メッセージが表示されます。
$ python numpy.py Traceback (most recent call last): File "/home/me/numpy.py", line 1, in
import numpy as np File "/home/me/numpy.py", line 3, in np.array([1, 2, 3]) ^^^^^^^^ AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a third-party module you intended to import) (シャンタヌ・ジェインによる寄稿 gh-95754。)
-
不正なキーワード引数が関数に渡された場合、エラー メッセージは正しいキーワード引数を提案するようになりました。
>>> "Better error messages!".split(max_split=1) Traceback (most recent call last): File "
" , line 1, in"Better error messages!".split(max_split=1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^ TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'? (Pablo Galindo Salgado と Shantanu Jain による寄稿: gh-107944。)
フリースレッドの CPython
CPython は、フリースレッド モードでの実行を実験的にサポートするようになりました。 グローバルインタープリタロック (GIL) が無効になっています。これは実験的な機能であるため、デフォルトでは有効になっていません。フリースレッド モードでは、通常は次のように呼ばれる別の実行可能ファイルが必要です。 python3.13t または python3.13t.exe。としてマークされた事前構築済みバイナリ フリースレッド 公式の一部としてインストールできます 窓
そして macOS インストーラー、または CPython は、次のコマンドを使用してソースからビルドできます。 --disable-gil オプション。
フリースレッド実行では、利用可能な CPU コアでスレッドを並列実行することで、利用可能な処理能力を最大限に活用できます。すべてのソフトウェアがこの恩恵を自動的に受けられるわけではありませんが、スレッド化を念頭に置いて設計されたプログラムは、マルチコア ハードウェア上でより高速に実行されます。
フリースレッドモードは実験的なものです 改善のための作業が進行中です。いくつかのバグと、シングルスレッドのパフォーマンスに大きな影響が出ることが予想されます。 CPython のフリースレッド ビルドは、環境変数を使用して実行時に GIL を有効にして実行することもできます。 PYTHON_GIL またはコマンドラインオプション -X gil=1。
現在のインタープリターがフリースレッドをサポートしているかどうかを確認するには、 python -VV
そして sys.version 「実験的なフリースレッドビルド」が含まれています。新しい sys._is_gil_enabled() 関数を使用すると、実行中のプロセスで GIL が実際に無効になっているかどうかを確認できます。
C-API 拡張モジュールは、フリースレッド ビルド専用にビルドする必要があります。での実行をサポートする拡張機能 ギル 無効な場合は、 Py_mod_gil スロット。単相初期化を使用する拡張機能では、次を使用する必要があります。 PyUnstable_Module_SetGIL() GIL を無効にした状態での実行をサポートするかどうかを示します。これらのメカニズムを使用しない C 拡張機能をインポートすると、GIL が明示的に無効になっていない限り、GIL が有効になります。 PYTHON_GIL 環境変数または
-X gil=0 オプション。フリースレッド ビルドで C 拡張機能を含むパッケージをインストールするには、pip 24.1 以降が必要です。
この取り組みは、Python への貢献者の大規模なコミュニティや、フリー スレッドのサポートをテストして有効にするサードパーティ プロジェクトを含む、多くの個人や組織のおかげで可能になりました。著名な寄稿者には、サム・グロス、ケン・ジン、ドンヒ・ナ、イタマール・オーレン、マット・ペイジ、ブレット・シマーズ、ディノ・ヴィーランド、カール・マイヤー、ネイサン・ゴールドバウム、ラルフ・ゴマーズ、リサンドロス・ニコラウなどが含まれます。これらの貢献者の多くは Meta に雇用されており、このプロジェクトをサポートするために重要なエンジニアリング リソースを提供してきました。
実験的なジャストインタイム (JIT) コンパイラ
CPython が構成およびビルドされている場合、 --enable-experimental-jit オプションを使用すると、ジャストインタイム (JIT) コンパイラーが追加され、一部の Python プログラムが高速化される可能性があります。 Windows では、使用します PCbuild/build.bat --experimental-jit JIT を有効にするか、 --experimental-jit-interpreter Tier 2 インタープリターを有効にします。ビルド要件とその他のサポート情報 に含まれています
Tools/jit/README.md。
の --enable-experimental-jit オプションはこれらの (オプションの) 値を取り、デフォルトは次のようになります。 yes もし --enable-experimental-jit はオプションの値なしで存在します。
-
no: Tier 2 および JIT パイプライン全体を無効にします。 -
yes:JITを有効にします。実行時に JIT を無効にするには、環境変数を渡しますPYTHON_JIT=0。 -
yes-off: JIT をビルドしますが、デフォルトでは無効にします。実行時に JIT を有効にするには、環境変数を渡します。PYTHON_JIT=1。 -
interpreter: Tier 2 インタープリターを有効にしますが、JIT は無効にします。インタプリタは、次のように実行することで無効にできます。PYTHON_JIT=0。
内部アーキテクチャは大まかに次のとおりです。
-
専門的なことから始めます 階層 1 バイトコード。見る 3.11 の新機能 詳細については。
-
Tier 1 バイトコードが十分にホットになると、それは純粋に内部的な新しい中間表現 (IR) に変換されます。 ティア2IR、マイクロオペレーション (「uop」) と呼ばれることもあります。
-
Tier 2 IR は Tier 1 と同じスタックベースの仮想マシンを使用しますが、命令形式はマシン コードへの変換により適しています。
-
Tier 2 IR にはいくつかの最適化パスがあり、解釈またはマシンコードに変換される前に適用されます。
-
Tier 2 インタープリターもありますが、主に最適化パイプラインの初期段階のデバッグを目的としています。 Tier 2 インタープリターは、Python を次のように構成することで有効にできます。
--enable-experimental-jit=interpreter。 -
JIT が有効な場合、最適化された Tier 2 IR はマシンコードに変換され、実行されます。
-
機械コードの変換プロセスでは、と呼ばれる技術が使用されます。
コピーしてパッチを適用する。実行時の依存関係はありませんが、LLVM に対するビルド時の依存関係が新たに存在します。
(JIT は Brandt Bucher 氏、Haoran Xu 氏と Fredrik Kjolstad 氏の論文からインスピレーションを得たもの。Tier 2 IR は Mark Shannon 氏と Guido van Rossum 氏。Tier 2 オプティマイザーは Ken Jin 氏による。)
定義された突然変異セマンティクス locals()
歴史的に、戻り値を変更した場合の期待される結果は、
locals() 定義は個々の Python 実装に任されています。 Python 3.13 以降、 PEP667 ほとんどのコード実行スコープに対して CPython の過去の動作を標準化しますが、変更されます。 最適化されたスコープ
(関数、ジェネレーター、コルーチン、内包表記、ジェネレーター式) を使用して、クロージャでキャプチャされたローカル参照の非ローカル変数を含む、現在割り当てられているローカル変数の独立したスナップショットを明示的に返します。
このセマンティクスへの変更は、 locals() 最適化されたスコープでは、暗黙的にターゲットを指定するコード実行関数のデフォルトの動作にも影響します。 locals() 明示的な名前空間が提供されていない場合 (例: exec() そして eval())。以前のバージョンでは、呼び出しによって変更にアクセスできるかどうか
locals() コード呼び出し後の関数実行は実装に依存していました。特に CPython では、このようなコードは通常、希望どおりに動作するように見えますが、他のコード (デバッガーやコード実行トレース ツールを含む) に基づいて最適化されたスコープでは失敗し、そのスコープ内の共有スナップショットがリセットされる可能性があります。これで、コードは常に最適化されたスコープ内のローカル変数の独立したスナップショットに対して実行されるため、後続の呼び出しでは変更が表示されることはありません。 locals()。このような場合に行われた変更にアクセスするには、明示的な名前空間参照を関連する関数に渡す必要があります。あるいは、結果のコード実行名前空間を返す高レベルのコード実行 API を使用するように、影響を受けるコードを更新することも合理的かもしれません (例: runpy.run_path() ディスクから Python ファイルを実行する場合)。
デバッガーや同様のツールが、この変更の影響を受けるスコープ内のローカル変数を確実に更新できるようにするには、 FrameType.f_locals 一貫性なく更新された共有変数を返すのではなく、これらのスコープ内のフレームのローカル変数およびローカルに参照される非ローカル変数にライトスルー プロキシを返すようになりました。 dict 未定義の実行時セマンティクスを持つインスタンス。
見る PEP667 関連する C API の変更や非推奨などの詳細については、を参照してください。影響を受ける人のために、移植に関する注意事項も以下に記載されています。
Python API そして C API。
(PEP と実装は、Mark Shannon と Tian Gao によって寄稿されました。
gh-74929。ドキュメントの更新は Guido van Rossum と Alyssa Coghlan によって提供されました。)
モバイルプラットフォームのサポート
PEP 730: iOS は現在、 ペップ11 サポートされているプラットフォーム、
arm64-apple-ios そして arm64-apple-ios-simulator 層 3 (2013 年以降にリリースされた iPhone および iPad デバイス、および Apple シリコン ハードウェア上で実行される Xcode iOS シミュレータ) をターゲットとします。
x86_64-apple-ios-simulator
(古いバージョンで実行されている Xcode iOS シミュレーター x86_64 ハードウェア)は、ティア 3 でサポートされるプラットフォームではありませんが、ベストエフォート型のサポートが提供されます。 (PEP の作成と実装は、Russell Keith-Magee によって寄稿されました。
gh-114099。)
PEP 738: Android は現在、 ペップ11 サポートされているプラットフォーム、
aarch64-linux-android そして x86_64-linux-android 層 3 のターゲット。32 ビット ターゲット arm-linux-androideabi そして i686-linux-android
Tier 3 でサポートされるプラットフォームではありませんが、ベストエフォート型のサポートが提供されます。 (PEP の作成と実装は、Malcolm Smith によって寄稿されました。
gh-116622。)
#Python #の新機能 #Python #3.13.0 #ドキュメント