2016-06-26 10 views
0

アルゴリズムとデータ構造を使用して問題を解決してプログラミングをしています。リストと辞書のdel演算子のパフォーマンスを比較すると、コードはdictとリストのパフォーマンスをPythonで比較するとエラーが発生する

です

Traceback (most recent call last): 
    File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\Problem_Solving\chapter2_del_list_dict.py", line 17, in <module> 
    time = t.timeit(number=1000) 
    File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\timeit.py", line 178, in timeit 
    timing = self.inner(it, self.timer) 
    File "<timeit-src>", line 6, in inner 
IndexError: list assignment index out of range 

そして、時には:

import timeit, random 
from timeit import Timer 

for i in range(1000000, 100000000, 1000000): 
    x = list(range(i)) 
    t = Timer("del x[random.randrange(%d)]" %i,\ 
       "from __main__ import random,x") 

    y = {j: None for j in range(i)} 
    key = random.choice(list(y.keys())) 
    t1 = Timer("del y[%d]" %key,\ 
       "from __main__ import y") 

    time1 = t1.timeit(number=1000)   
    time = t.timeit(number=1000) 

    print("%d, %15.5f, %15.5f" % (i, time, time1)) 

はここでエラーです

Traceback (most recent call last): 
    File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\Problem_Solving\chapter2_del_list_dict.py", line 18, in <module> 
    time1 = t1.timeit(number=1000) 
    File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\timeit.py", line 178, in timeit 
    timing = self.inner(it, self.timer) 
    File "<timeit-src>", line 6, in inner 
KeyError: 280015 

助けてくれてありがとう!

答えて

2

タイムドスニペットのすべてのリピートは同じxで実行されます。したがって、一度要素が削除されると、リストは短くなり、別の要素を削除した後はさらに短くなります。最終的には、リストが短すぎるために、それ以上存在しないインデックスをランダムに削除しようとします。

timeitスニペットの外で削除するキーを選択しているので、2番目の例ではdictを使用すると常に失敗します。したがって、最初の実行では、キーを削除し、2回目の実行で同じキーをもう一度削除しようとしますが、キーがもう存在しないために失敗します。

+0

このタイプのものは、正確な方法でテストするのが難しいです。 1つの可能性は、リスト/辞書の作成をテスト済みのスニペットに移動することです。これは、テストされたタイミングを膨らませますが、あなたはリスト/ディクテーションの作成時間だけを別々にテストし、削除時間を見積もるためにそれを減算することができます。 – BrenBarn

関連する問題