Instagramで開発された高速なPython「Cinder」とは、パフォーマンス向上

© 株式会社マイナビ

Python Software Foundationは5月20日(米国時間)、「Python Software Foundation News: The 2021 Python Language Summit: CPython Performance Improvements at Instagram」において、Instagramで開発された「Cinder」と呼ばれるPython実行環境のパフォーマンスについて伝えた。

CinderはCPython3.8をベースにパフォーマンスを重視して内部開発された実装系で、バイトコードインラインキャッシュ、コルーチンイーガー評価、メソッドアットアタイムJIT、バイトコードコンパイラなど多くのパフォーマンス最適化機能が取り込まれているという。

Cinderで取り組まれた主な最適化は次のとおり。

  • StopIterationを発生させないで値を送受信するように処理を変更。こうした例外は大きなオーバーヘッドの原因となっており、StopIterationを発生させないように変更することで単純なベンチマークでは1.6倍の高速化を実現した。ただし、本番環境では5%のパフォーマンス向上にとどまっている(この変更はすでにPython 3.10にアップストリームされている)。
  • 関数呼び出しに伴って発生するタスク作成とスケジューリングにかかるコストの回避。本番感で3%の高速化を実現。このイーガー評価はまだアップストリームされていないが、現在議論している。
  • シャドーバイトコードと呼ばれるバイトコードのインラインキャシュ機能の導入。本番環境で5%の高速化を実現(実装されたインラインキャッシュはPython 3.10で導入されたインラインキャッシングとは若干異なるアプローチを取っている)。
  • ディクショナリウォッチャーの導入。シャドウバイトコードとの組み合わせで5%の高速化を実現。
  • __builtins__に関して常に固定されたbuiltinsディクショナリを指すように変更し、本番環境で1%の高速化を実現。
  • JITの実験的な変更。

こうした変更は時間をかけて少しずつ行ってきたため生産性の向上を測定するのは難しいとしつつ、全体では20%から30%ほどの高速化が実現できたのではないかと説明されている。Cinderはオープンソース・ソフトウェアとして公開されている(GitHub - facebookincubator/cinder: Instagram's performance oriented fork of CPython.)。