のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Cythonを使って、Pythonを高速化してみよう②:型をつけてみる。

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

Cythonについてもう少しやってみます。

Cython公式の素数の一覧を出力するサンプルを少し変更してみました。
こちらをCythonを使って高速化してみましょう。

def primes(kmax):
    result = []
    k = 0
    n = 2
    p = [0] * 100000
    while k < kmax:
        i = 0
        while i < k and n % p[i] != 0:
            i = i + 1
        if i == k:
            p[k] = n
            k = k + 1
            result.append(n)
        n = n + 1
    return result

まずは、変更を何も加えていない時です。
primesに与える引数は10000の時です。

速度
Python 11.518
Cython 8.725
pypy 0.840

まず、ソースコードをそのままにしても、Cythonを利用したほうがいくらか早くなっていることがわかります。
次に型をつけてみましょう。
ソースコードとしては以下のようになります。

def primes(kmax):
    result = []
    cdef int k = 0
    cdef int n = 2
    cdef int p[100000]
    
    while k < kmax:
        i = 0
        while i < k and n % p[i] != 0:
            i = i + 1
        if i == k:
            p[k] = n
            k = k + 1
            result.append(n)
        n = n + 1
    return result

変化した箇所はcdef intをつけて型を指定したことです。
Cythonで計測すると0.266990184784になりました。型がつくだけで、こんなに高速化できるのには本当に驚いた…。
今度から遅くなる時にはCythonを有効活用してみるかなぁ。。。