Cython でお手軽に python プログラムを高速化する方法のメモ。
C/C++ を使わずに、以下だけで高速化します。
・メソッドの引数に型宣言を追加
・メソッド内の変数の型宣言を追加
まず、python プログラム(~.py) に以下の変更を行って、~.pyx を作成します。
※主な型
整数: int
文字列: unicode
リスト: list
辞書: dict
■bar_lib.py
■bar_lib.pyx
次に、setup.py ファイルを作成します。
※複数の .pyx がある場合には、リストに .pyx ファイルを追加します
そして、setup.py を実行します。
bar_lib を import すれば、bar() を実行できます。
■foo.py
C/C++ を使わずに、以下だけで高速化します。
・メソッドの引数に型宣言を追加
・メソッド内の変数の型宣言を追加
まず、python プログラム(~.py) に以下の変更を行って、~.pyx を作成します。
※主な型
整数: int
文字列: unicode
リスト: list
辞書: dict
■bar_lib.py
def bar(n, ts, idx): nts = ts[idx:idx+n] nkey = "\t".join([t['key'] for t in nts]) return nkey
■bar_lib.pyx
# cython: language_level=3 # メソッドの引数の型を追加 def bar(int n, list ts, int idx): # メソッド内の変数の型を定義 cdef list nts cdef dict t cdef unicode nkey nts = ts[idx:idx+n] nkey = u"\t".join([t['key'] for t in nts]) return nkey
次に、setup.py ファイルを作成します。
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize(['bar_lib.pyx']))
※複数の .pyx がある場合には、リストに .pyx ファイルを追加します
そして、setup.py を実行します。
python setup.py build_ext --inplace
bar_lib を import すれば、bar() を実行できます。
■foo.py
import bar_lib def run(): bar_lib.bar() if __name__== '__main__': run()