ヨーロッパのPythonコミュニティと交流できる3日間「EuroPython 2019」参加レポート

第3回 3日目キーノートはPythonパフォーマンスの今昔,注目のPython 3.8,Pythonの今後

この記事を読むのに必要な時間:およそ 5 分

EuroPython3日目の様子をお伝えします。

この日のキーノートであったPythonの高速化についての深い話や,Python 3.8以降の新機能についてのトークなどについてレポートします。

キーノート:Python Performance: Past, Present and Future ―Victor Stinner

Victor Stinner氏はRed Hatで働いており,2010年からCPythonのメンテナンスを行っているそうです。このトークでは,Pythonのパフォーマンスについて過去,現在,未来について語られました。

過去

CPython(C言語で書かれたPython実装)は1989年から開発されています。他に以下のような実装系が紹介されました。

  • 1997:Jython
  • 1998:Stackless Python
  • 2006:IronPython
  • 2014:MicroPython

そしてPythonを高速化するプロジェクトとして,以下が紹介されました。これらの多くはJITコンパイラを使用して高速化を目指しています。

  • 2002-2012:psyco(Armin Rigo)
  • 2007:PyPy
  • 2009-2010:Unladen Swallow(Google)
  • 2014-2017:Pyston(Dropbox)
  • 2016-2017:Pyjion(Microsoft)

Pythonを高速化するには,CPythonをフォークする場合と,一から実装するという2つの方法があります。CPythonからフォークする場合,古いCPythonの実装によるパフォーマンスの限界や,GILグローバルインタプリタロックの制限があります。一から実装する場合はGILの制限などがありませんが,C拡張はサポートされなかったり遅いという問題があります。CPythonには30名のアクティブなコア開発者がおり,最新の機能は最初にCPythonに実装されます。

ここからは,2つの終了したプロジェクトについての説明がありました。

Unladen Swallow(2011)
Googleのプロジェクト。多くのGoogleのPythonコードではパフォーマンスは重要な問題ではないため終了。
Pyston(2017)
Dropboxのプロジェクト。パフォーマンスに関するコードはGoのような他の言語に切り替えた。互換性の維持に多くの時間を割いた。

現在

PyPyはCPythonと置き換え可能で,4.4倍速くなるそうです。しかしPyPyにも課題はあります。C拡張はCPythonよりは遅い,JITのためにより多くのメモリと起動時間が必要であることです。そのためPyPyはサーバーサイドでずっと起動しているサービスなどに向いています。

次に,図を使用してGILについての説明がありました。CPUバウンドの処理の場合,マルチスレッドでもGILの制限によって1つのスレッドしか実行されません。そこでマルチプロセッシングでGILの制限を受けない方法があります。Python 3.8から,共有メモリがここで使用できるようになるそうです。

別の解決策としてCythonも紹介されていました。CythonはC拡張をPythonと似た言語で簡単に記述する方法です。複数のPythonバージョンで動作します。

NumbaはPythonとNumPyの一部処理をJITで高速化するツールです。GPUなどを使用して高速化が可能です。

また,Python Speed CenterというサイトでCPythonの実行速度を計測しているそうです。ある変更によってCPythonが速くなったか,遅くなったかを確認できるようになっています。このサイトはよくできているなと感じました。

未来

今後のPythonのパフォーマンス向上についていくつか紹介されていました。

現在のC APIにはいくつか課題があるため,Python 3.8でC APIを3つのレベルに分類するそうです。また安定版のABI(Application Binary Interface)がPython 3.8以降でサポートされるそうです。

CPythonのGCをTracing GCに変更するそうです。Tracing GCは多くのモダンなプログラミング言語やPyPyで採用されています。ただし,既存のC APIは参照カウントを継続して使用するそうです。

サブインタープリタはPEP 554 -- Multiple Interpreters in the Stdlibで提案されたものです。1つのCPythonプロセスの中で複数のインタープリターを動作させることにより,GILの制限を回避するというアイデアです。

Pythonは遅いとよく言われますが,過去にいくつかのプロジェクトが失敗したこと,現在いくつかの対策があること,そして今後も継続的にPythonのパフォーマンスについて改善されていくことがわかるトークでした。

The Story of Features Coming in Python 3.8 and Beyond ―Andrey Vlasovskikh

Andrey Vlasovskikh氏

Andrey Vlasovskikh氏

Andrey Vlasovskikh氏@vlasovskikhによるPython 3.8や今後のPythonについてのトークを聞いてきました。Andrey氏は2016年のPyCon JPのキーノートスピーカーでもあり,そのときはPython 3.6について語ってくれました。Andrey氏はPyCharmのテクニカルリードでもあり,PEP484,561などのPythonのtypeシステムに対して貢献しています。

話のメインとなるPytnon 3.8ですが,2019年10月21日にリリース予定で,すでに機能は確定したベータバージョンがリリースされています。新機能を知るためにはWhat's Newがよいドキュメントです。このトークではいくつかの新しい機能や言語仕様について,その歴史やメリットデメリットについて紹介していきました。

まずはPEP 572 -- Assignment Expressionsです。PEP 572は以下のように:=という演算子で代入式を実現します。

 >>> if m := re.search('[abc]', 'spam'):
 >>>    print(m.group())
 a

このPEP,最初はx := exprではなく(expr as x)という書き方で提案されていたそうです。全体を()で囲んで変数がサブローカルスコープになるという複雑なものだったが,現在のようにシンプルな形になったそうです。知りませんでした。

また,このPEP572の採択後Guido氏がBDFLを辞任し,その後PEP 13 -- Python Language GovernanceでPython言語をどのように運営していくかが議論され,5名のPython Steering Councilが選ばれたという話がありました。Python Steering Councilについては筆者もUS PyConのレポートで紹介しています。

次に紹介したのはPEP 570 -- Python Positional-Only Parametersです。これは関数をdef pow(x, y, z=None, /):のように定義すると/の前の引数は位置指定しかできなくなります(``pow(x=10, y=20)と呼ぶとエラーになります⁠⁠。なぜ区切り記号が/なのかというと,すでにPEP 436 -- The Argument Clinic DSLによってC APIの関数の引数用に用いられていたためです。

また,新しいTypeとしてProtocolLiteralFinalTypedDictが紹介されました。新しいTypeはGitHubの/python/typingで定義されており,Typing summits,開発Sprintなどで進められているそうです。

Python 3.8の先の話としていくつか紹介されていましたが,興味深かったのはMypycです。Cythonに似ているけどPythonの型を使い,シングルコアでのパフォーマンスが速くなるそうです。またPEP 554 -- Multiple Interpreters in the Stdlibも興味深いです。こちらはマルチコア上でのパフォーマンスを上げる取り組みだそうです。

Python 3.8の新機能の詳しい紹介や,Python 3.9以降の取り組みについて興味深い発表でした。

  • 発表スライド:The Story of Features Coming in Python 3.8 and Beyond

    この日の帰りにAndreyに声をかけたことろ,私のことを覚えてくれていました。PyCon JP 2016のトートバッグがノートPC入れにちょうどいいらしく,愛用しているそうです(この日も肩から下げていました⁠⁠。⁠またどこかのPyConで会いましょう」と話して別れました。

著者プロフィール

鈴木たかのり(すずきたかのり)

一般社団法人PyCon JP,副代表理事,株式会社ビープラウド所属。

部内のサイトを作るためにZope/Ploneと出会い,その後必要にかられてPythonを使い始める。PyCon JPでは2011年1月のPyCon mini JPからスタッフとして活動し,2014年-2016年のPyCon JP座長。他の主な活動は,Pythonボルダリング部(#kabepy)部長,Python mini Hack-a-thon(#pyhack)主催など。

共著書に『Pythonによるあたらしいデータ分析の教科書(2018 翔泳社刊)』『Pythonプロフェッショナルプログラミング 第3版(2018 秀和システム刊)』『Pythonエンジニア ファーストブック(2017 技術評論社刊)』『いちばんやさしいPythonの教本(2017 インプレス刊)』などがある。

最近の楽しみはPython Boot Campの講師で訪れた土地で,現地のクラフトビールを飲むこと。2019年は世界各国のPyConでの発表に挑戦している。趣味は吹奏楽とボルダリングとレゴとペンシルパズル。

Facebook:takanory.net

Twitter:@takanory

Github:takanory