2013-08-06
■集合に含まれているか探す
プロファイラを使うべきだけど横着。
- ソート済みのlistを2分探索
- ソートされていないlistのin演算子
- dictのin演算子
- dictのgetメソッド
- setのin演算子
を調べた。
dictとsetのin演算子が速い。setの方がいつもちょっとだけ速い。dictを使うのはバッドノウハウで、意図通りのコードになるsetを使うべき。
import bisect
from datetime import datetime
import random
def index(a, x, l):
"""Locate the leftmost value exactly equal to x"""
i = bisect.bisect_left(a, x)
return i != l and a[i] == x
if __name__ == '__main__':
SIZE = 10000
i = [x * 2 for x in range(SIZE)]
a = datetime.now()
for idx in xrange(SIZE * 2):
if index(i, idx, SIZE):
pass
b = datetime.now()
print b - a
random.shuffle(i)
a = datetime.now()
for idx in xrange(SIZE * 2):
if idx in i:
pass
b = datetime.now()
print b - a
d = dict([(x, 1) for x in i])
a = datetime.now()
for idx in xrange(SIZE * 2):
if idx in d:
pass
b = datetime.now()
print b - a
a = datetime.now()
for idx in xrange(SIZE * 2):
if d.get(idx):
pass
b = datetime.now()
print b - a
s = set(i)
a = datetime.now()
for idx in xrange(SIZE * 2):
if idx in s:
pass
b = datetime.now()
print b - a
0:00:00.022995 0:00:03.421239 0:00:00.002715 0:00:00.005084 0:00:00.002595
というメモ。
