Pythonの起動速度問題

Reducing Python’s startup time [LWN.net]

  • Pythonの起動時間は遅い。コア開発者もわかっちゃいる。
  • 起動時間は特にコマンドラインプログラムの実行時間に影響する。他のスクリプト言語より遅いので困る。
    • Python 3.7の起動時間は2.7より2倍遅い。
    • 基本いろんな標準モジュールを読み込むので遅い。
  • 最近の議論: python-dev, python-ideas それぞれのメーリングリストで7月半ばから続いている。
  • この議論での焦点はcollections.namedtumple()
    • namedtupleは標準ライブラリのいろんなところで使われている。
    • ただし議論は広範囲に渡っている。

namedtupleの使い方については省略。

提示された解決法はこんな感じ。要するにnamedtuple()で作成されたクラス(_CacheInfo)をベタ書きしている。クラスのソースコード_CacheInfo._sourceから文字列で取得できるので、それをコピペするだけで済む。これでnamedtuple()がクラスを生成する手間賃が省ける寸法だ。

問題もある。namedtupleが生成したものに対する変更・修正がfunctoolsに反映されないことだ。加えて、Raymond Hettingerはこの変更に現実的な問題があるとは納得していない旨述べている

I would like to caution against any significant changes to save microscopic amounts of time. Twisting the code into knots for minor time savings is rarely worth it and it not what Python is all about.

これにNick Coghlanも同意している

Caring about start-up performance is certainly a good thing, but when considering potential ways to improve the situation, structural enhancements to the underlying systems are preferable to ad hoc special cases that complicate future development efforts.

アドホックなやり方で速度を改善するのではなく、正しい構造的を見定めてコードを書くのが望ましいということですな。

  • Hettingerはこのbugをクローズした
    • 2016.12にre-openしてArgument Clinicというアプローチを試みた。
    • が、前とだいたい同じ理由でまたクローズされた。
  • 2017.7にJelle Zijlstraがnamedtupleの生成を最適化するパッチを投下。exec()呼びを減らすもの。
    • これは既存の実装とおおむね互換性があったが、_source属性をサポートしていなかった。
    • bugをリオープンにしたい人とクローズにしたい人とで小競り合いがあったらしい。古典的な「バグ戦争」。
  • 不平「_source属性を消して欲しくない、それはnamedtupleの本質的な要素だ。あと、起動時間を最適化するのは努力に見合わない」
  • Antoine Pitrou「調べた限り、_sourceは効果的に利用されていない。起動時最適化はそれに比べ有用である」

startup time is actually a very important consideration nowadays, both for small scripts and for interactive use with the now very wide-spread use of Jupyter Notebooks. A 1 ms. cost when importing a single module can translate into a large slowdown when your library imports (directly or indirectly) hundreds of modules, many of which may create their own namedtuple classes.

(時間切れ。記事はまだ続くが言語デザインに関する人々が思想を語る場になっていくっぽい。あまり興味もないのでここまで)