在Python中比较dict和list的del性能时出错



我正在用算法和数据结构做问题解决的编程练习。练习是比较列表和字典上del操作符的性能,代码如下:

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:UsersUserAppDataLocalProgramsPythonPython35-32Problem_Solvingchapter2_del_list_dict.py", line 17, in <module>
    time = t.timeit(number=1000)
  File "C:UsersUserAppDataLocalProgramsPythonPython35-32libtimeit.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

,有时:

Traceback (most recent call last):
  File "C:UsersUserAppDataLocalProgramsPythonPython35-32Problem_Solvingchapter2_del_list_dict.py", line 18, in <module>
    time1 = t1.timeit(number=1000)
  File "C:UsersUserAppDataLocalProgramsPythonPython35-32libtimeit.py", line 178, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
KeyError: 280015

谢谢你的帮助!

计时片段的所有重复都在同一个x上运行。因此,一旦一个元素被删除,列表就会变短,然后在你删除另一个元素之后,它会更短,以此类推。最终,您可能会随机尝试删除不再存在的索引,因为列表变得太短了。

第二个示例,使用字典,将总是失败,因为在那里您选择要删除整个timeit片段之外的哪个键。因此,在第一次运行时,它将删除一个键,然后在第二次运行时,它将再次尝试删除相同的键,这将失败,因为该键不再存在。

最新更新