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

在Python中比较dict和list的del性能时出错,python,list,dictionary,Python,List,Dictionary,我正在用算法和数据结构解决问题进行编程练习。练习是比较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

我正在用算法和数据结构解决问题进行编程练习。练习是比较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:\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
回溯(最近一次呼叫最后一次):
文件“C:\Users\User\AppData\Local\Programs\Python\35-32\Problem\u Solving\chapter2\u del\u list\u dict.py”,第17行,在
时间=t.timeit(数字=1000)
文件“C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\timeit.py”,第178行,在timeit中
定时=自内(it、自定时器)
文件“”,第6行,在内部
索引器:列表分配索引超出范围
有时:

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
回溯(最近一次呼叫最后一次):
文件“C:\Users\User\AppData\Local\Programs\Python 35-32\Problem\u solutioning\chapter2\u del\u list\u dict.py”,第18行,在
time1=t1.timeit(数字=1000)
文件“C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\timeit.py”,第178行,在timeit中
定时=自内(it、自定时器)
文件“”,第6行,在内部
关键字错误:280015

谢谢你的帮助

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


第二个例子是dict,它总是失败的,因为在这里您选择了在整个
timeit
代码段之外删除哪个键。因此,在第一次运行时,它将删除一个键,然后在第二次运行时,它将再次尝试删除同一个键,这将失败,因为该键不再存在。

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


第二个例子是dict,它总是失败的,因为在这里您选择了在整个
timeit
代码段之外删除哪个键。因此,在第一次运行时,它将删除一个密钥,然后在第二次运行时,它将再次尝试删除同一个密钥,这将失败,因为该密钥不再存在。

这种类型的东西很难以精确的方式进行测试。一种可能是将列表/目录创建移动到测试代码段中。这会增加测试的时间,但是你可以单独测试列表/目录的创建时间,然后减去它,得到删除时间的估计值。这类事情很难用精确的方法进行测试。一种可能是将列表/目录创建移动到测试代码段中。这将增加测试的计时,但您可以对列表/目录创建时间进行单独测试,然后减去该时间以获得删除时间的估计值。