Python3.11の新機能 Python 3.11の新機能(その1) CPython高速化計画

(その1) CPython高速化計画(その2) 特殊化適応的インタープリタ(その3) 関数呼び出しのインライン化(その4) 例外グループとTaskGroup(その5) PEP-646 可変長ジェネリックス(その6) PEP-673 Self型(その7) PEP-681 データクラス変換(その8) PEP-655 TypedDictの要素ごとに省略可・不可を指定する(その9) その他の型ヒント関連機能(その10) 正規表現 - アトミックグループとPossessive指定子(その11) 標準ライブラリ(その12) Python本体の機能追加

今年も、Pythonのメジャーリリースの季節がやってまいりました。2022年10月3日にリリース予定となっているPython 3.11の新機能を紹介します。

CPython 高速化計画

Python 3.11で最大のニュースは、なんと言っても Faster CPython: CPython 高速化計画 が開始されたことでしょう。

CPython 高速化計画は、Mark Shannon氏提案したプランに基づいてPythonの高速化を行うもので、Pythonを毎年50%高速化し、互換性を保ちつつ 4年間で5倍高速化する ことを目標としています。

この計画はMicrosoft社の出資を獲得し、Pythonの父であるGuido van Rossum氏も加わって開発が進められています。

ベンチマーク

さて、CPython 高速化計画最初のリリースとなるPython 3.11では、どの程度の高速化が実現されたでしょうか?以下に pyperformance によるベンチマーク結果を掲載します。

計測環境

  • MacBook Pro(16 inch, 2019)
  • 2.4 GHz 8コアIntel Core i9
  • 64 GB 2667 MHz DDR4
  • macOS Monterey 12.3
  • Python 3.10.6 (v3.10.6:9c7b4bd164, Aug 1 2022, 17:13:48) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
  • Python 3.11.0rc1 (v3.11.0rc1:41cb07120b, Aug 5 2022, 11:44:46) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
ベンチマーク 3.10 3.11
deltablue 7.78 ms 4.19 ms 1.86x faster
scimark_sor 191 ms 114 ms 1.68x faster
logging_silent 172 ns 108 ns 1.59x faster
scimark_monte_carlo 101 ms 63 ms 1.59x faster
crypto_pyaes 126 ms 79 ms 1.58x faster
go 237 ms 151 ms 1.57x faster
raytrace 489 ms 311 ms 1.57x faster
richards 72.3 ms 46.6 ms 1.55x faster
chaos 111 ms 73 ms 1.53x faster
nbody 147 ms 96 ms 1.53x faster
pyflate 709 ms 483 ms 1.47x faster
scimark_lu 165 ms 112 ms 1.47x faster
logging_simple 9.49 us 6.56 us 1.45x faster
pickle_pure_python 473 us 325 us 1.45x faster
mako 16.3 ms 11.3 ms 1.44x faster
hexiom 10.1 ms 7.0 ms 1.43x faster
logging_format 10.5 us 7.4 us 1.43x faster
unpack_sequence 61.0 ns 42.8 ns 1.42x faster
float 109 ms 77 ms 1.41x faster
django_template 51.9 ms 38.3 ms 1.36x faster
html5lib 90.3 ms 66.3 ms 1.36x faster
spectral_norm 157 ms 116 ms 1.36x faster
unpickle_pure_python 329 us 252 us 1.31x faster
genshi_text 33.1 ms 25.4 ms 1.30x faster
xml_etree_process 76.2 ms 59.8 ms 1.28x faster
fannkuch 497 ms 392 ms 1.27x faster
2to3 352 ms 280 ms 1.26x faster
regex_compile 183 ms 145 ms 1.26x faster
tornado_http 166 ms 132 ms 1.26x faster
chameleon 9.78 ms 7.92 ms 1.24x faster
dulwich_log 96.7 ms 81.0 ms 1.19x faster
genshi_xml 76.4 ms 63.9 ms 1.19x faster
nqueens 110 ms 92 ms 1.19x faster
sqlalchemy_imperative 24.5 ms 20.7 ms 1.18x faster
sympy_integrate 24.4 ms 20.8 ms 1.18x faster
python_startup_no_site 12.8 ms 15.0 ms 1.17x slower
sqlalchemy_declarative 160 ms 137 ms 1.17x faster
scimark_fft 402 ms 348 ms 1.16x faster
sqlite_synth 2.81 us 2.43 us 1.16x faster
regex_v8 25.2 ms 22.0 ms 1.15x faster
sympy_expand 556 ms 486 ms 1.14x faster
sympy_str 341 ms 299 ms 1.14x faster
sympy_sum 196 ms 173 ms 1.14x faster
xml_etree_generate 96.8 ms 86.3 ms 1.12x faster
scimark_sparse_mat_mult 5.64 ms 5.09 ms 1.11x faster
telco 6.88 ms 6.18 ms 1.11x faster
pathlib 37.8 ms 35.2 ms 1.07x faster
pickle_list 4.32 us 4.03 us 1.07x faster
python_startup 16.6 ms 17.7 ms 1.07x slower
json_dumps 13.8 ms 13.1 ms 1.05x faster
meteor_contest 110 ms 104 ms 1.05x faster
regex_dna 185 ms 176 ms 1.05x faster
xml_etree_iterparse 108 ms 103 ms 1.05x faster
pickle_dict 26.4 us 25.5 us 1.04x faster
unpickle 14.9 us 14.4 us 1.04x faster
pickle 11.2 us 10.9 us 1.03x faster
unpickle_list 4.53 us 4.41 us 1.03x faster
json_loads 27.1 us 26.5 us 1.02x faster
pidigits 188 ms 188 ms 1.00x faster
regex_effbot 3.36 ms 3.36 ms 1.00x slower
xml_etree_parse 160 ms 160 ms 1.00x faster

なかなかの成果ではないでしょうか?最大で 186% と、かなりの高速化が実現されているのがわかると思います。

あまり変化のないテストもありますが、今回の高速化はPython言語で書かれたプログラムが主な対象となっており、C言語で書かれた、もともと高速に動作するプログラムにはあまり影響しないようです。

今後、順調に高速化が行われ、Python3.14 では予定通り5倍のパフォーマンスが実現されるのでしょうか?非常に楽しみです。

Pythonの過去と未来

従来、CPythonはこのような高速化にはともすれば消極的で、遅くて困る場合は「C言語で拡張モジュールを書きましょう!」というのが一般的なガイドラインでした。

現代ではプログラミング言語を高速化するためのさまざまなテクニックが知られていますが、Pythonはどちらかというと処理系のわかりやすさ・シンプルさ・互換性・移植性を重視しており、あまりそういったメカニズムを取り入れない傾向にありました。Pythonインタープリタのコアはスタックマシンと言われるタイプの単純な仮想マシンで、シンプルで分かりやすくはありますが、コンピュータサイエンスの教科書に出てくるような、原始的な仕組みでした。

過去には Unladen Swallow プロジェクト のようにJITコンパイラを導入する試みもありましたが、数年で頓挫してしまいました。Unladen SwallowはGoogleの出資で開始されたプロジェクトでしたが、開発自体が難航したことに加えて、Python開発者コミュニティでJITコンパイラへの関心を得られず、協力者が足りなかったことが中止の理由の一つとしてあげられています。

しかし、Python3.11からは、高速化のために仮想マシンにも大きな変更が行われ、高速化に向けて舵を切りました。Python 3.10で取り入れられた PEGパーザ などとあわせて、Pythonのありようが大きく変わっていく予兆なのかもしれません。

Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索