Python : 高速化/最適化 (PyPy / Cython / Numba / Cache)

下記は個人的な感想です。※ 適宜、加筆していきます。

PyPyがよくなってますね、私としてはNumpyの導入敷居がとても下がった事に感謝。Scipyも早く平易に使用できることを願います。Win版はNumpyが標準で入っているみたいです。

PyPyは本当に期待大です。公式サイトによると、通常Pythonに比べ平均4.2倍早い。単純計算で4日かかる解析が約1日で終わるのはとても助かる。

(Python贔屓な話をするとRustと同等の速度を得られるそうです。

Pythonの高速化手段

  1. Compile系
    1. Cython
    2. PyPy
    3. Numba
  2. Cache系
    1. diskcache
    2. anycache
    3. functiontool.cache
  3. その他
    1. Nupmyらライブラリによる高速化。
    2. アルゴリズムによる高速化
    3. Pythonの仕様に特化した高速化。
      • 有名な話ですがPythonはfor文が遅い、とのこと。

コンパイル系の高速化手段-比較

項目 Cython PyPy Numba
高速性^1 高速? 中速? ?
デバッグ IDEの対応に依存 VSCでもOK、ほぼ普通のPythonと同じ様に使える ?
対応モジュール^1 多い 中、しかもbuild必要 ?
用途^1 パッケージソフト向け オールマイティー ?
  • [^1] 主観的評価。

個別

Cython

  1. メリット
    1. C言語経由で高速化するので高速(だろう)
    2. 多くのpipモジュール下でも適用可。特殊な場合を除き、適用できると思われる。
  2. デメリット
    1. IDEが開発途上。PyCharm(Pro, v2021版)でも.pyxの解析は不完全。
      • .pyxに変換後に関数やらの定義へ飛べない @ PyCharm 2021.12.15.
    2. デバッグもtoolを選ぶ
      VSCの「Python C++ Debugger」が使えるとよさそうですが。
    3. メンテナンス/可読性の低下。
  3. 用途
    1. 上記の通り、メンテ性は低いが、高速化できるので、配布用パッケージソフトに向いているでしょう。

PyPy

Pythonが愛され、C言語やRustなど高速な言語を組み入れらた結果、PyPyのようなJITなインタプリタは、そのpre-built部が障害となってpypyの導入の敷居が高くなってしまっているような気がします(主観、詳しい調査できておらず)。そのため、せっかくPyPyのような平易な高速化手法があるのに、なかなか浸透しない。

  • 改善としては、pypy用にpre-builtされたモジュールがpipからもっとインストールできるようになると良さそうです。
    1. メリット
    2. 通常のPythonコードがrun可能。
      • デバッグを通常のPythonで行い、解析サービスをPyPyで起動するのがよいかと。
    3. デメリット
    4. 最新のPython Verと乖離がある。(Python3.10が時点でpypyはpython3.8.12互換)。
    5. pypyに対応しないモジュールが多少ある
    6. インストールするpackageのbuildが大変。
      • 故に当分は、dockerで使用となると思われます。
      • 通常のPythonと同様にpypiにbuild済みpypy対応の.whlファイルが貯まる?と、もっと一般化なりそう、期待大。
    7. Platform : 主観ですが、PyPyを意図通り使うための比較。
    8. Docker: 一番よさそう。ただし、Seleniumはheadlessでは無ければ大変、など制約がある。
    9. Anaconda系: PyPyはpandas経由でnumpyを使用した際にエラー発生(@2021.12.15)。Pypy用にはbuiltされてないと思われます。
    10. MacOS: 必要devライブラリの取得が手動になるため大変。
    11. Win: build環境構築が大変、かつMacOSと同じで私は敬遠ぎみ。
    12. Linux: Dockerと同じで、比較的基盤構築できそう。(というかDockerはLinux前提なので。)

キャッシュ

  1. 不揮発キャッシュと揮発キャッシュがある。解析結果は積極的にCacheしています。解析途中で落ちることも多々ありますので。
    • Diskcache
    • Anycache

高速化手段へのモジュール可否

おいおい追記。Y:Yes(対応), N:No(非対応), ?は未確認。Y?:たぶん可、N?:たぶん不可。

NAME MEMO Cython PyPy
Stremlit 内部のprotocolbuf?がJIT未対応などで不可 N@2021.12 N@2021.12
Pandas Y Y
Numpy Y Y
Cyptodemo buildにはRust必要 Y? Y
PyArrow buildにはapache-arrow必要 Y? Y
tracemalloc 使用メモリ可視化 ? N @v7.3.7