Python : 高速化/最適化 (PyPy / Cython / Numba / Cache)
下記は個人的な感想です。※ 適宜、加筆していきます。
PyPyがよくなってますね、私としてはNumpyの導入敷居がとても下がった事に感謝。Scipyも早く平易に使用できることを願います。Win版はNumpyが標準で入っているみたいです。
PyPyは本当に期待大です。公式サイトによると、通常Pythonに比べ平均4.2倍早い。単純計算で4日かかる解析が約1日で終わるのはとても助かる。
(Python贔屓な話をするとRustと同等の速度を得られるそうです。
- Rustは本当に動作が高速なのか? Pythonとの比較で分かる、Rustのパフォーマンス特性
ただ、安全性を考慮した高速化が容易に?導入できる点ではRustは魅力てきですね。
Cyptodemoの様にPython用ライブラリながら、内部はRustという高速方法も低速化したりするかもしれません。)
Pythonの高速化手段
- Compile系
- Cython
- PyPy
- Numba
- Cache系
- diskcache
- anycache
- functiontool.cache
- その他
- Nupmyらライブラリによる高速化。
- アルゴリズムによる高速化
- Pythonの仕様に特化した高速化。
- 有名な話ですがPythonはfor文が遅い、とのこと。
コンパイル系の高速化手段-比較
項目 | Cython | PyPy | Numba |
---|---|---|---|
高速性^1 | 高速? | 中速? | ? |
デバッグ | IDEの対応に依存 | VSCでもOK、ほぼ普通のPythonと同じ様に使える | ? |
対応モジュール^1 | 多い | 中、しかもbuild必要 | ? |
用途^1 | パッケージソフト向け | オールマイティー | ? |
- [^1] 主観的評価。
個別
Cython
- メリット
- C言語経由で高速化するので高速(だろう)
- 多くのpipモジュール下でも適用可。特殊な場合を除き、適用できると思われる。
- デメリット
- IDEが開発途上。PyCharm(Pro, v2021版)でも.pyxの解析は不完全。
- .pyxに変換後に関数やらの定義へ飛べない @ PyCharm 2021.12.15.
- デバッグもtoolを選ぶ
VSCの「Python C++ Debugger」が使えるとよさそうですが。 - メンテナンス/可読性の低下。
- IDEが開発途上。PyCharm(Pro, v2021版)でも.pyxの解析は不完全。
- 用途
- 上記の通り、メンテ性は低いが、高速化できるので、配布用パッケージソフトに向いているでしょう。
PyPy
Pythonが愛され、C言語やRustなど高速な言語を組み入れらた結果、PyPyのようなJITなインタプリタは、そのpre-built部が障害となってpypyの導入の敷居が高くなってしまっているような気がします(主観、詳しい調査できておらず)。そのため、せっかくPyPyのような平易な高速化手法があるのに、なかなか浸透しない。
- 改善としては、pypy用にpre-builtされたモジュールがpipからもっとインストールできるようになると良さそうです。
- メリット
- 通常のPythonコードがrun可能。
- デバッグを通常のPythonで行い、解析サービスをPyPyで起動するのがよいかと。
- デメリット
- 最新のPython Verと乖離がある。(Python3.10が時点でpypyはpython3.8.12互換)。
- pypyに対応しないモジュールが多少ある
- インストールするpackageのbuildが大変。
- 故に当分は、dockerで使用となると思われます。
- 通常のPythonと同様にpypiにbuild済みpypy対応の.whlファイルが貯まる?と、もっと一般化なりそう、期待大。
- Platform : 主観ですが、PyPyを意図通り使うための比較。
- Docker: 一番よさそう。ただし、Seleniumはheadlessでは無ければ大変、など制約がある。
- Anaconda系: PyPyはpandas経由でnumpyを使用した際にエラー発生(@2021.12.15)。Pypy用にはbuiltされてないと思われます。
- MacOS: 必要devライブラリの取得が手動になるため大変。
- Win: build環境構築が大変、かつMacOSと同じで私は敬遠ぎみ。
- Linux: Dockerと同じで、比較的基盤構築できそう。(というかDockerはLinux前提なので。)
キャッシュ
- 不揮発キャッシュと揮発キャッシュがある。解析結果は積極的に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 |