Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

setの話

checked が配列なので pos in checked が遅い。

勝手に採点 (Re: 自分ならこう書く - pythonでA*) - methaneのブログ

あー高速化のためにsetを使うってやったことなかったな。

計測

import timeit

a = range(100000)
b = set(a)

def test():
    return 100000 in a

def test2():
    return 100000 in b

res = timeit.timeit("test()", "from __main__ import test", number=1000)
print(res)
res = timeit.timeit("test2()", "from __main__ import test2", number=1000)
print(res)

結果

9.95783400536
0.000999927520752

set速えな。

生成(変換)コスト

こーいう処理になることはほとんどないのだけど、生成からinまで。

import timeit

def test():
    a = range(100000)
    return 100000 in a

def test2():
    a = range(100000)
    b = set(a)
    return 100000 in b

res = timeit.timeit("test()", "from __main__ import test", number=1000)
print(res)
res = timeit.timeit("test2()", "from __main__ import test2", number=1000)
print(res)

結果

16.2891459465
29.0829648972

inの部分はほぼ無視できるぐらいの速さなのだが、setを作るのはそれなりにコストが高いようだ。

setの注意

setになんでも突っ込んでいいのか?というとまあそうではなくて

set の要素は辞書のキーと同様に __hash__ と __eq__ の両方を定義していることが必要です。

http://www.python.jp/doc/release/lib/types-set.html

って制限もあるので注意。