ITの隊長のブログ

ITの隊長のブログです。Pythonを使って仕事しています。最近は機械学習をさわりはじめたお(^ω^ = ^ω^)

Cython使ってみた

スポンサードリンク

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を書く

参考になるものコピペして作成したほうが楽.

github.com

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ファイル名は同じにしたほうが良い。じゃないと踏んでしまう.

stackoverflow.com

build

ビルド

$ python setup.py build_ext --inplace

確認する

module下に配置した場合は、from xxx.a import xxxで呼べる.

$ python
>>> from module_name.a import x
>>> x(1, 2)
1