Python 我如何设计一个实验来比较del操作符在列表和字典上的性能?
我想解决中的编程练习3。这个练习想让我设计一个实验,比较del操作符在列表和字典上的性能 我的代码是Python 我如何设计一个实验来比较del操作符在列表和字典上的性能?,python,python-3.x,Python,Python 3.x,我想解决中的编程练习3。这个练习想让我设计一个实验,比较del操作符在列表和字典上的性能 我的代码是 import timeit import random for i in range(10000,1000001,20000): t = timeit.Timer("del x[random.randrange(%d)]" % i, "from __main__ import random, x") x = list(range(i)) lst_time = t.tim
import timeit
import random
for i in range(10000,1000001,20000):
t = timeit.Timer("del x[random.randrange(%d)]" % i, "from __main__ import random, x")
x = list(range(i))
lst_time = t.timeit(number=1000)
x = {j:None for j in range(i)}
d_time = t.timeit(number=1000)
print("%d,%10.3f,%10.3f" % (i, lst_time, d_time))
但它失败,并显示错误消息Indexer:
列表分配索引超出范围
如何修复代码以解决练习3?
del
对列表进行适当的修改,以减小其大小,但您永远不会每次调整randrange
以进行补偿-例如,拾取的randrange
始终是列表的原始大小,因此,可以选择一个大于当前列表的值,并尝试del
它将为您提供索引器。您可以调整timeit以使用randrange和当时列表的长度,而不是硬编码的起点,例如:
t = timeit.Timer("del x[random.randrange(len(x))]", "from __main__ import random, x")
旁注:x={j:None for j in range(i)}
可以写成x=dict.fromkeys(range(i))
除了您遇到的问题:您的del x[random.randrange(%d)]%i
乘以randrange
和del
。这不是一个好时机。只尝试计时del
而不进行其他调用。问题本身是,当您多次调用del
(timeit
这样做)时,列表会变小,因此您有时会尝试删除其中较长的项目。每次尝试创建一个新列表(但不要在创建列表时计时)@zvone感谢您的明智评论。我意识到我的问题是什么。我也应该承认,我真的在为“randrange”和“del”计时。谢谢你的帮助。现在我在代码中发现了bug。现在我可以用你加载的代码解决我的问题了。