こんにちは!内藤です!
気温が暖かくなり、札幌でも桜が咲き始めました。
風は冷たいのですが、山の雪が溶けるまでの辛抱です。
Pythonを高速化するツールであるCythonを使用する機会がありましたので、情報をまとめてみたいと思います。
参照URL
インストール
公式ページにもありますが、動作に必要なパッケージを事前にインストールしておきます。
sudo apt-get install build-essential python3-dev
Cython自体はpipで普通にインストールできますが、バージョンについて注意が必要です。
安定板のバージョンは、2023年4月28日現在、0.29.34ですが、こちらはPython2系をメインターゲットにしているようです。
そのため、
した型定義にきちんと対応していません。from __future__ import annotation
Python3系を使用している場合は、3.0.0b2を使用した方がよさそうです。
pip install Cython==3.0.0b2
動作原理
Pythonのコードを一度C言語(またはC++言語)にトランスパイルした後、そのコードをビルドすることでバイナリの実行体を作成します。
作成したバイナリ(拡張子*.so)はPythonから見ると普通のモジュールに見え、
文でインポートができるようになります。import
コードのビルドには複数の方法がありますが、Cythonをインストールすると
というコマンドがインストールされますので、そちらを使うのが簡単です。cythonize
高速化作業
オプションをつけることで、対象のPythonコードがどの程度C言語側で動いているかをHTMLで出力してくれます。cythonize
`コマンドに
`-a
基本的には下記のようにコードを書き換えつつ、上記の解析結果でできるだけC言語側で動作する部分を増やしていくのが定石になります。
- 関数の引数と戻り値に型定義をつける
- ローカル変数にはCython向けの型定義をつける
- 内包表記を使用せずにfor文にする
注意点
動作原理に記載しましたが、CythonはOSネイティブなバイナリコードを生成します。
そのため、
を実行したOSと実際に動作するOSが同一である必要があります。cythonize
AWSやDocker環境で使用している場合は、注意が必要です。
次回に続く・・・?
Cythonの高速化にはいくつかコツやポイントがあるので、次回はそのあたりもまとめてみようと思います。