我想使用 python ch.2 解决算法和数据结构问题中的编程练习 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.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))
但它失败并显示错误消息索引错误:
列出超出范围的分配索引。
如何修复代码以解决练习 3?
>del
就地改变列表,因此您可以减小其大小,但您永远不会调整每次循环的randrange
以进行补偿 - 例如 - 选择randrange
将始终是列表的原始大小,因此可以选择一个大于列表当前值的值并尝试del
它会给你IndexError
。您可以调整 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))