dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

python と cython でリストの各要素への繰り返し処理の速度を比較

2018-12-18 00:01:08 | python
python と cython でリストの各要素への繰り返し処理の速度を比較したメモ。

for ループで10万要素のリストの各要素にアクセスし、その実行時間を比較した結果は以下のとおり。
python iterator: 0.0013873577117919922
python index: 0.004186868667602539
cython iterator: 0.0005218982696533203
cython index: 0.0004062652587890625

cython でリストに対してインデックスでアクセスするのが最も速い、という結果になりました。

プログラムは以下の通り。
■test.pyx
# -*- coding:utf-8 -*-
# cython: language_level=3

def c_iterator(list items):
    cdef int a
    cdef int item

    for item in items:
        a = item
    return a

def c_index(list items):
    cdef int i, num
    cdef int a

    num = len(items)
    for i in range(num):
        a = items[i]
    return a

■test_main.py
# -*- coding:utf-8 -*-

import time
import test

def p_iterator(items):
    a = 0
    for item in items:
        a = item
    return a

def p_index(items):
    a = 0
    num = len(items)
    for i in range(num):
        a = items[i]
    return a

def run():
    n = 100000
    items = [x for x in range(n)]

    # python iterator
    from_time = time.time()
    res = p_iterator(items)
    to_time = time.time()
    t = to_time - from_time
    print("python_iterator: %s" % (t))

    # python index
    from_time = time.time()
    res = p_index(items)
    to_time = time.time()
    t = to_time - from_time
    print("python_index: %s" % (t))

    # cython iterator
    from_time = time.time()
    res = test.c_iterator(items)
    to_time = time.time()
    t = to_time - from_time
    print("cython_iterator: %s" % (t))

    # cython index
    from_time = time.time()
    res = test.c_index(items)
    to_time = time.time()
    t = to_time - from_time
    print("cython_index: %s" % (t))

    return 0

if __name__ == '__main__':
    res = run()
    exit(res)

この記事についてブログを書く
« python のリストの実装方法を... | トップ | python と cython でリストと... »

python」カテゴリの最新記事