今年も、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のありようが大きく変わっていく予兆なのかもしれません。