首页 > 解决方案 > 如何设计一个实验来比较 del 运算符在列表和字典上的性能?

问题描述

我想使用 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))

但它失败并显示错误消息 IndexError:

列表分配索引超出范围。

如何修复代码以解决练习号。3?

标签: pythonpython-3.x

解决方案


del将列表更改到位,因此您正在减小其大小,但您永远不会调整randrange每个 timeit 循环来补偿 - 例如 -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))


推荐阅读