python と cython でリストの各要素への繰り返し処理の速度を比較したメモ。
for ループで10万要素のリストの各要素にアクセスし、その実行時間を比較した結果は以下のとおり。
python iterator: 0.0013873577117919922
python index: 0.004186868667602539
cython iterator: 0.0005218982696533203
cython index: 0.0004062652587890625
cython でリストに対してインデックスでアクセスするのが最も速い、という結果になりました。
プログラムは以下の通り。
■test.pyx
■test_main.py
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)