Python 3.9:新機能と優れた機能

本日リリースされたPython3.9は、言語の機能と言語の開発方法の両方に大幅な変更をもたらします。Pythonはここ数年人気が急上昇しており、データサイエンスや機械学習などの急速に進化する分野でその使用が爆発的に増加しています。プロジェクトは、すべての新しい需要に対応するために懸命に取り組んでいます。 

Python3.9のすべての大きな新機能の概要は次のとおりです。

Pythonは毎年のリリースサイクルに切り替わります

この時点まで、Pythonは18か月のリズムで開発およびリリースされてきました。PEP 602は、Python開発チームが年次リリースサイクルを採用することを提案し、その提案は受け入れられました。 

年間リリースサイクルは、リリースごとの機能が少ないことを意味しますが、機能テストに関するフィードバックが速くなり、リリースごとに破損する可能性のある変更が少なくなるため、ユーザーとLinuxディストリビューションマネージャーがPythonをより頻繁にアップグレードするインセンティブが高まります。また、開発サイクルの後半に提案された新機能が、新しいリリースに組み込まれるのにそれほど時間はかからないことも意味します。

新しいタイムラインは、Python 3.9が2020年10月に出荷されることを意味します。Python3.10は2020年5月19日に正式にプレアルファ開発を開始し、Python 3.9が出荷されるとアルファ開発フェーズに入り、2021年10月に出荷されます。今後のPythonリリースは同じパターン。

Pythonはデフォルトで高速になります

Pythonのすべてのリビジョンでは、以前のバージョンよりもパフォーマンスが向上しています。Python 3.9は、既存のコードに変更を加えることなくパフォーマンスを向上させる2つの大きな改善をもたらします。

最初の改善には、vectorcallPython3.8で導入されたプロトコルのより多くの使用が含まれます。vectorcall呼び出し用に作成された一時オブジェクトを最小化または削除することにより、多くの一般的な関数呼び出しを高速化します。Python 3.9では、いくつかのPythonビルトイン— range, tuple, set, frozenset, list, dictvectorcall内部で使用して実行を高速化します。

2番目の大きなパフォーマンスエンハンサーは、Pythonソースコードのより効率的な解析です。CPythonランタイムの新しいパーサーは、パフォーマンスの問題に対処するように設計されたのではなく、元のパーサーの内部の不整合に対処するように設計されました。ただし、重要なフリンジの利点は、特に大量のコードの場合、解析が高速になることです。

その他のPython文字列および辞書関数

Pythonを使用すると、一般的なデータ型を簡単に操作できます。Python3.9は、文字列と辞書の新機能でこの使いやすさを拡張しています。文字列の場合、プレフィックスとサフィックスを削除する新しい方法があります。これは、長い間手作業で実行する必要があった操作です。辞書の場合、1つは2つの辞書を新しい辞書にマージし、もう1つは1つの辞書の内容を別の辞書で更新するユニオン演算子があります。

デコレータはいくつかの制限を失います

デコレータを使用すると、Python関数をラップして、プログラムで動作を変更できます。以前は、デコレータは@記号、名前(eg func)、または点線の名前(func.method)、およびオプションで単一の呼び出し(func.method(arg1, arg2))のみで構成できました。Python 3.9では、デコレータを任意の有効な式で構成できるようになりました。

この制限を回避するための長年の方法の1つは、デコレータとして使用した場合に、より複雑な式の代わりとなる関数またはラムダ式を作成することでした。これで、デコレータとして機能できるものが得られれば、どの式でもかまいません。

新しいPythonタイプの操作

過去数回のバージョンで、Pythonは型ヒントのサポートを拡張しました。これは主にリンターとコードチェッカーのためです。CPythonでは実行時に型が適用されないため、Pythonを静的に型付けされた言語にする予定はありません。ただし、型ヒントは大規模なコードベースで一貫性を確保するための強力なツールであるため、Pythonコードは型ヒントを持つことで引き続きメリットを得ることができます。 

型ヒントと型注釈の2つの新機能が、Python3.9に導入されました。1つは、コレクションのコンテンツ(リストや辞書など)のタイプヒントがPythonでネイティブに利用できるようになったことです。これは、たとえばlist[int] 、typingライブラリがそれを行う必要なしに、リストを—整数のリスト—として記述することができることを意味します。

Pythonのタイピングメカニズムへの2番目の追加は、柔軟な関数と変数の注釈です。これにより、Annotatedタイプを使用して、事前に(リンティングツールを使用して)または実行時に調べることができるメタデータを使用してタイプを記述することができます。たとえば、Cで型Annotated[int, ctype("char")]と見なす必要のある整数を記述するために使用できますchar。デフォルトでは、Pythonはそのような注釈に対して何もしませんが、コードリンターによって使用できます。 

Python内部の改善

Pythonの内部のクリーンアップ、改良、および最新化は、Pythonの開発者にとって継続的なイニシアチブであり、Python3.9にはその流れにいくつかの変更があります。

1つ目は、モジュールがインポート機構と相互作用する方法の再設計です。 Cで記述されたPython拡張モジュールは、インポート時に通常のPythonモジュールのように動作する新しいロードメカニズムを使用できるようになりました。 Pythonの標準ライブラリのいくつかのモジュールは、この動作を新たにサポートします_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time, _weakref。新しいロードメカニズムにより、拡張モジュールをPythonでより柔軟に処理できるだけでなく、高度なフック動作などの新しい機能も可能になります。

2番目のクリーンアップイニシアチブは、CPythonの安定した内部ABIであり、Python 3の存続期間中持続することが保証されています。これまで、Pythonのメジャーリビジョンはそれぞれ以前のバージョンとABI互換性がなく、新しいバージョンごとに拡張モジュールを再コンパイルする必要がありました。今後、安定したABIを使用する拡張モジュールは、Pythonのバージョン間で機能します。Python 3.9では、標準ライブラリの次のモジュールが安定したABIを使用しますaudioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib

Python3.9のその他の変更

  • Pythonの標準ライブラリは、IANAタイムゾーンデータベースをサポートするようになりました。このデータベースはよく管理されており、広く使用されており、Pythonの日時ライブラリで直接使用する方法があると、大幅に時間の節約になります。
  • 新しい文字列メソッドを使用すると、プレフィックスとサフィックスを簡単に削除できます。これは、必要と思われるよりも少し多すぎる定型文を必要とする、一般的な日常の使用シナリオの1つです。newメソッド.removeprefix().removesuffix()メソッドは、文字列内に存在する場合、問題のプレフィックスまたはサフィックスを除いた文字列の変更されたコピーを返します。

Pythonでさらに多くのことを行う方法

  • コードをクリーンに保つための4つのPython型チェッカー
  • Pythonスタイル:Pythonコードをクリーンアップするための5つのツール
  • Pythonリストデータ型を操作する方法
  • BeeWareブリーフケースでPythonアプリをパッケージ化する方法
  • Anacondaを他のPythonと並べて実行する方法
  • Pythonデータクラスの使用方法
  • Pythonで非同期を始めましょう
  • Pythonでasyncioを使用する方法
  • Python非同期オーバーホールへの3つのステップ
  • PyInstallerを使用してPython実行可能ファイルを作成する方法
  • Cythonチュートリアル:Pythonを高速化する方法
  • Pythonをスマートにインストールする方法
  • PoetryでPythonプロジェクトを管理する方法
  • PipenvでPythonプロジェクトを管理する方法
  • Virtualenvとvenv:Python仮想環境の説明
  • Pythonvirtualenvとvenvはすべきこととすべきでないこと
  • Pythonのスレッド化とサブプロセスの説明
  • Pythonデバッガーの使用方法
  • timeitを使用してPythonコードをプロファイリングする方法
  • cProfileを使用してPythonコードをプロファイリングする方法
  • PythonをJavaScriptに変換する方法(そしてまた元に戻す方法)