2016-09-18 9 views
0

setlistの両方についてin文のパフォーマンスを評価しようとしています。私はモジュールtimeでそれを行うことができますが、timeitモジュールを試してみたいと思います。 は、だから私のコードは次です:リスト内の文を評価し、timeitモジュールを使用して設定した奇妙な結果

from timeit import Timer 


def func_to_test(val, s): 
    return val in s 

if __name__ == "__main__": 
    val = 346 
    n = 100000 
    s = set([x for x in range(n)]) 
    l = [x for x in range(n)] 
    list_timer = Timer("func_to_test(%s, %s)" % (val, l), "from __main__ import func_to_test") 
    set_timer = Timer("func_to_test(%s, %s)" % (val, s), "from __main__ import func_to_test") 
    print(list_timer.timeit(100)) 
    print(set_timer.timeit(100)) 

出力は次のようになります。

0.1953735960000813 
0.6675883569996586 

しかしlistため、なぜin文がsetよりも優れた性能を "持っていますか"? 私はそれがないことを知っていますが、なぜtimeitモジュールでこれらの結果がありますか?

+0

この場合の定数係数は、より大きいnを使用して試してみてください。小さなn – Natecat

答えて

2

セットアップステートメントはfunc_to_testをインポートしますが、それ以外は何もしません。したがって、実際のタイミングテストは、メンバシップテストに要する時間だけでなく、リスト(リストテストの場合)またはリストおよび(セットテストの場合)を作成するのにかかる時間もタイミングします。セットアップステートメントでiterableを作成すると、問題が解消します。

>>> import timeit 
>>> timeit.timeit('346 in s', setup='s=list(range(100000))') 
9.412489017458922 
>>> timeit.timeit('346 in s', setup='s=set(list(range(100000)))') 
0.08872845571155352 
>>> timeit.timeit('346 in s', setup='s=set(range(100000))') 
0.09335872296618675 
+0

ありがとうございます、タイミングの正しい方法を指摘します。しかし、なぜ私のコードがそのような結果を生むのですか? – Litwisha

+0

@Litwisha - メンバーシップのテストにかかる時間だけでなく、リストを作成してメンバーシップをテストするか、リストを作成してセットを作成し、メンバーシップをテストするのに必要な時間を探しているためです。 – TigerhawkT3

+0

それは私にちょっと変です。リストとセットの作成は 'func_to_test'ではなくメインブロックで評価されているからです。 – Litwisha

関連する問題