KZKY memo

自分用メモ.

Cython基本

Cythonでできるのこと

  • .pyxをcコードにする
  • Cythonの変数にcの型をもたせられる
  • C/C++ APIの利用

要するに,pythonぽく書けるので生産性が高くて,高速化も可能.

Installation

pip install cython

Hello World

ここここに書いてみた.

コンパイル方法

2通りある.

  • pyximport: 外部Cライブラリや特殊なビルド設定が必要ない場合.
  • setup.py: 上記以外の場合.自作のCライブラリに依存している等.Makefileと思っておけばいい.

pyximport

import pyximport; pyximport.install(pyimport = True)
import (basename ${filename.pyx} .pyx)

な感じで使う.

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("helloworld", ["helloworld.pyx"])]
)

な感じのコードを書く.

build_extはbuildコマンドで,Extensionは,この名前の.soができる.

使い方は,

python setup.py build_ext [--inplace]

静的片付け

def cdef type func(type param)  # 関数引数の場合

cdef type param0, param1, ...  # 変数の場合

とかく.

サンプルを書いた

結果
kzk@localhost:~/languages/cython/speedup_exmaple
$ python main.py
666666.686668
Python: 0.354106903076 [s]
666666.686668
Cython: 0.196939945221 [s]
666666.686668
cdef Cython: 0.0480411052704 [s]
666666.686668
cdef v2 Cython: 0.00502610206604 [s]

### Ratio Comparison### 
Python: 1.0
Cython: 1.79804509785
cdef Cython: 7.37091499213
cdef v2 Cython: 70.4535837958

すげーはやい.

C/C++ APIの複雑なラップ等は,チュートリアル,ユーザガイド,リファレンスを見ながらやればいい.

現状Cythonを使うというユースケースで思いつくのは,