雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

Cython 事始め

概要

  • Cython の簡単な使い方

Cython とは

  • Python の記法ベースで書ける。
  • コンパイラががんばって Cython コードを C/C++ コードに翻訳してくれるので、(Python と比べて) 実行が速い!!
  • 位置的には Python と C/C++ の中間のイメージ。
    • Python と C/C++ のコードをつなぐためにも利用できる。

インストール

  • C コンパイラが必要。Linux だったら普通は既に入っている。入ってないならインストールする。
  • Cython 自体もインストールする必要あり。
    • pip or easy_install で入れることができる。
$ pip install cython

Cython コードのビルド

  • 必要なファイル
    • .pyx ファイル : Python っぽい、Cython の形式で書かれる。
    • setup.py : .pyx ファイルをビルドするために必要なファイル。
  • 生成されるファイル
    • .c ファイル : .pyx を Cython が変換して作成される。
    • .so ファイル : .c ファイルを C コンパイラでコンパイルして作成される。Python から直接 import 出来る。

  • ビルド手順
    • 1) .pyx を Cython で .c ファイルに変換する。
    • 2) .c ファイルを C コンパイラでコンパイル。

  • [1] .pyx ファイルを作成。
    • 簡単な足し算、と入力値の表示。
      • global を使用してみる。問題なく使える??
      • 型定義すると速くなるとのこと。今回はそのままの形で記述。
#! -*- coding: utf-8 -*-

c = 0
def add( a, b ) :
    global c
    c = a + b
    return c

def printResult() :
    print c

  • [2] setup.py を作成
    • Cython のドキュメントに合ったものをほぼ丸写し。
#! -*- coding: utf-8 -*-

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

ext_modules = [
    Extension( "calculate", ["calculate.pyx"] ),
]

setup(
    name = "Sample calculate app",
    cmdclass = { "build_ext" : build_ext },
    ext_modules = ext_modules,
)

  • [2] コンパイル
    • 下記コマンドで、上記 1) と 2) が両方通るみたい。
      • 下記コマンドでエラー発生しなければ、OK。
$ python setup.py build_ext --inplace
  • [3] 確認
    • 同ディレクトリ内で Python を起動し、読み込めることを確認。
      • global に設定した c も問題なく使えた!!
$ python
>>> import calculate
>>> calculate.add( 2, 3 )
5
>>> calculate.printResult()
5
>>> calculate.add( 5, 10 )
15
>>> calculate.printResult()
15