Numba使おうと試行錯誤していたが死んだのでCython使おうとした。
環境
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G1212
$ python -V
Python 3.6.3 :: Anaconda, Inc.
Cythonのインストール
$ pip install ctyhon
Cythonにしたいファイルを用意
既存のものか、新規ファイルを用意.
- module_name/a.pyx
def x(a, b): return a
既存のもの場合、型に注意したほうが良い。エラーになるので。
また、拡張子はpyx
にする。
setup.pyを書く
参考になるものコピペして作成したほうが楽.
kazuki-nagasawa.hatenablog.com
- setup.py
import os from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext NAME = 'module_name' here = os.path.abspath(os.path.dirname(__file__)) ext_modules = [ Extension('{}.a'.format(NAME,), [os.path.join(here, NAME, 'a.pyx')]), ] setup( name='Sample a app', cmdclass={'build_ext' : build_ext}, ext_modules=ext_modules, )
ビルドした後に生成される.so
ファイルを配置先をモジュール以下にすることができる。
また、Extension(xxx, xxx.pyx)
とファイル名とpythonファイル名は同じにしたほうが良い。じゃないと踏んでしまう.
build
ビルド
$ python setup.py build_ext --inplace
確認する
module下に配置した場合は、from xxx.a import xxx
で呼べる.
$ python >>> from module_name.a import x >>> x(1, 2) 1