PythonのListとDictionaryの検索機能の速さ
"in"を使って要素の有無を判定する時、ListとDictionaryで速いのはどちらなのだろうと疑問に思ったので調べた。
with Python 2.7.11
l = [1,2,3,4,5] for i in range(10000000): if 1 in l: pass
real 0m1.017s
user 0m0.853s
sys 0m0.141s
d = {1:"", 2:"", 3:"", 4:"", 5:""} for i in range(10000000): if 1 in d: pass
real 0m1.053s
user 0m0.888s
sys 0m0.143s
単純に検索するだけならList型のほうが速い。(何に使うかは知らない)
ただ、普通は検索したあとそのindexに対してカウントしたり何かしらアクションを加えるので、結局Dictionaryの方が速い。
l = [1,2,3,4,5] for i in range(10000000): if 1 in l: index = l.index(1) l[index] = l[index]
real 0m4.239s
user 0m4.074s
sys 0m0.139s
d = {1:"", 2:"", 3:"", 4:"", 5:""} for i in range(10000000): if 1 in d: d[1] = d[1]
real 0m2.105s
user 0m1.938s
sys 0m0.144s
追記
要素の数が大きくなったときはDictionaryの方が早いようだった。
#d = {i:True for i in range(10000000)} d = range(10000000) for i in range(100000000): 1 in d
real 0m15.324s
user 0m13.374s
sys 0m1.961s
d = {i:True for i in range(10000000)} #d = range(10000000) for i in range(100000000): 1 in d
real 0m14.133s
user 0m11.922s
sys 0m2.220s
Dictionary objectはListに比べて作るのに時間がかかるため、本来ならforの回数を変化させて線形近似しなければいけないが、速さがDictionary>Listの例が取れたのでそこは割愛した。
ちなみにDictionaryに於いて"d[1]"と"i in d"の検索速度に差はないようである。