内藤 裕二/ 2023年 4月 28日/ 技術

こんにちは!内藤です!
気温が暖かくなり、札幌でも桜が咲き始めました。
風は冷たいのですが、山の雪が溶けるまでの辛抱です。

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というコマンドがインストールされますので、そちらを使うのが簡単です。

高速化作業

cythonize`コマンドに`-aオプションをつけることで、対象のPythonコードがどの程度C言語側で動いているかをHTMLで出力してくれます。
基本的には下記のようにコードを書き換えつつ、上記の解析結果でできるだけC言語側で動作する部分を増やしていくのが定石になります。

  • 関数の引数と戻り値に型定義をつける
  • ローカル変数にはCython向けの型定義をつける
  • 内包表記を使用せずにfor文にする

注意点

動作原理に記載しましたが、CythonはOSネイティブなバイナリコードを生成します。
そのため、cythonizeを実行したOSと実際に動作するOSが同一である必要があります。
AWSやDocker環境で使用している場合は、注意が必要です。

次回に続く・・・?

Cythonの高速化にはいくつかコツやポイントがあるので、次回はそのあたりもまとめてみようと思います。