2016-04-05 3 views
0

このコードを動作させるのにますます疲れて困惑しています。これは、「データ構造とアルゴリズムによる問題解決」Web教科書からのアルゴリズム分析課題です。それは、リスト要素と辞書要素を削除するのにかかる時間を比較するよう求められます。リスト削除時間のテストはうまくいきますが、辞書要素を削除しようとすると、キーエラーが発生します。なぜこれがそうだと誰が説明できますか?timeitを使用して辞書のキーの削除時間をテストする際のPythonのキーエラー

import timeit 
import pylab 

x_list = [] 
delList_list = [] 
delDictionary_list = [] 

delDictionary = timeit.Timer("del x[0]", 
         "from __main__ import x") 
delList = timeit.Timer("del x[100]", 
       "from __main__ import x") 
for i in range(10000,100001,20000): 

    x_list.append(i) 

    x = list(range(i)) 
    delListTime = delList.timeit(number=1000) 
    delList_list.append(delListTime) 

    x = {j:None for j in range(i)} 


    delDictTime = delDictionary.timeit(number = 1000) 
    delDictionary_list.append(delDictTime) 


pylab.xlabel('Size') 
pylab.ylabel('Time to complete contains operation') 
pylab.plot(x_list, delList_list, 'c') 
pylab.plot(x_list, delDictionary_list, 'm') 
pylab.show() 
+1

入手しているエラーメッセージ(スタックトレース)を添付してください。 – Pedru

+0

'x = {j:範囲(i)のjのためのなし}' x = dict.fromkeys(range(i)) 'で置き換えることができます。 –

答えて

1

timeit繰り返しテスト対象のコードが、あなたの辞書には、そのコードの一部ではありません。そのため、最初の削除後にKeyErrorが表示されます。

テストコード次の辞書を選択するには、辞書の先頭に十分なコピーを生成し、を生成する必要があります。でもキールで物事を保つために、リストのオブジェクトに対して同じ操作を行います:

delDictionary = timeit.Timer("del next(xiter)[0]", "from __main__ import xiter") delList = timeit.Timer("del next(xiter)[100]", "from __main__ import xiter") # ... and in the loop x = [list(range(i)) for _ in range(1000)] # 1000 identical lists xiter = iter(x) delListTime = delList.timeit(number=1000) delList_list.append(delListTime) x = [dict.fromkeys(range(i)) for _ in range(1000)] # 1000 identical dictionaries xiter = iter(x) delDictTime = delDictionary.timeit(number = 1000) delDictionary_list.append(delDictTime) 

だからそれぞれの試験は、比較フェアを作り、新鮮リストまたは辞書オブジェクトを与えています。

私は{j:None for j in range(i)}を、はるかに速くdict.fromkeys(range(i))に置き換えました。後者はCコードでループし、デフォルト値はNoneです(ただし、可変オブジェクトを使用するとコピーは作成されません)。

関連する問題