読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

Cythonによる拡張モジュール開発

Python

C/C++で開発し、Pythonスクリプトから利用できる関数 データ型を提供
Pythonが動的にロードする共有ライブラリ
(*.so *pyd)
Pythonから呼び出せないCライブラリへのインターフェース
Pythonではパフォーマンス不足

拡張モジュールは面倒
C/C++が必要

せっかくPythonなのにC/C++で書くのか
関数 データ型定義が面倒

参照アカウント管理

Cython
Python専用プログラミング言語

Pythonの拡張モジュールを開発するための専用プログラミング言語
Pythonのほぼ上位互換
インタープリタではなくコンパイラ

Pylexからfork

lxml
Sage
SciPy
PyYAML

など

Pythonの構文でC言語と同じ処理を書ける
文法はPython2とほぼ同じ

C言語で書くと面倒だったのが型定義とかかんたんになる
変数の型宣言「も」できる(アーリーバインディング)
型チェックは静的 動的 両方

GIL制御
Pythonスクリプトが複数のスレッドで同時に実行されないように制御する仕組み

型指定をすると処理速度が格段に早くなる

処理時間はほとんど関数呼び出し

$ easy_install cython
def add(a):
    import time
    time1 = time.clock()
    x = 0
    for i in range(1, a):
        x += i
    time2 = time.clock()
    time = time2 - time1
    print str(time)
    print x

>>> from test_py import *
>>> add(1000)
0.000167
499500
>>> add(10000)
0.001614
49995000
>>> add(100000)
0.011948
4999950000
>>> add(1000000)
0.094009
499999500000
>>> add(10000000)
0.926426
49999995000000
>>> add(100000000)
10.136141
4999999950000000
>>> import pyximport; pyximport.install(pyimport = True)
(, )
>>> import test_py
>>> add(100000000)
8.450127
4999999950000000

def add(long A):
    import time
    time1 = time.clock()
    cdef long x = 0
    for i in range(1, A):
        x += i
    time2 = time.clock()
    time = time2 - time1
    print str(time)
    return x