2016-06-26 3 views
0

Ich mache Programmierung Übung von Problemlösung mit Algorithmen und Datenstrukturen.Die Übung ist die Leistung von del-Operator auf Listen und Wörterbücher vergleichen, hier ist der Code:Fehler beim Vergleichen der Leistung von del für dict und Liste in Python

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)) 

Hier die Fehler:

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 

Und manchmal:

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 

Danke für jede Hilfe!

Antwort

2

Alle Wiederholungen des zeitgesteuerten Snippets werden auf demselben x ausgeführt. Wenn also ein Element gelöscht wird, ist die Liste kürzer, und nach dem Löschen eines anderen Elements ist es noch kürzer und so weiter. Möglicherweise versuchen Sie zufällig, einen Index zu löschen, der nicht mehr vorhanden ist, weil die Liste zu kurz geworden ist.

Ihr zweites Beispiel, mit dem Diktat, wird immer fehlschlagen, weil Sie dort auswählen, welcher Schlüssel außerhalb des gesamten Snippets timeit gelöscht werden soll. Beim ersten Mal wird ein Schlüssel gelöscht, und beim zweiten Durchlauf versucht er, den gleichen Schlüssel erneut zu löschen, was fehlschlägt, weil dieser Schlüssel nicht mehr vorhanden ist.

+0

Diese Art von Ding ist schwierig, in einer genauen Weise zu prüfen. Eine Möglichkeit besteht darin, die Erstellung der Liste/des Diktats in das getestete Snippet zu verschieben. Dadurch werden die getesteten Timings aufgebläht, aber Sie können dann einen separaten Test nur der Listen-/Diktat-Erstellungszeit durchführen und diesen subtrahieren, um eine Schätzung der Löschungszeit zu erhalten. – BrenBarn

Verwandte Themen