我已经变得越来越累,越来越困惑,试图让这个代码工作。这是“用数据结构和算法解决问题”网络教科书中的算法分析作业。它要求比较删除list元素和dictionary元素所需的时间。对列表删除时间的测试工作正常,但无论我是否尝试删除字典元素,都会给我一个键错误。有人能解释一下为什么会这样吗?在
import timeit
import pylab
x_list = []
delList_list = []
delDictionary_list = []
delDictionary = timeit.Timer("del x[0]",
"from __main__ import x")
delList = timeit.Timer("del x[100]",
"from __main__ import x")
for i in range(10000,100001,20000):
x_list.append(i)
x = list(range(i))
delListTime = delList.timeit(number=1000)
delList_list.append(delListTime)
x = {j:None for j in range(i)}
delDictTime = delDictionary.timeit(number = 1000)
delDictionary_list.append(delDictTime)
pylab.xlabel('Size')
pylab.ylabel('Time to complete contains operation')
pylab.plot(x_list, delList_list, 'c')
pylab.plot(x_list, delDictionary_list, 'm')
pylab.show()
timeit
重复被测代码,但您的字典不是该代码的一部分。因此,在第一次删除之后,您将得到一个KeyError
。在您必须预先生成足够多的字典副本,然后在测试代码中选择下一个字典。对列表对象执行相同的操作,以使事情保持平稳:
因此,每个测试都被赋予一个fresh列表或dictionary对象,这样比较就公平了。在
请注意,我将
{j:None for j in range(i)}
替换为速度更快的dict.fromkeys(range(i))
;后者在C代码中循环,默认值是None
(但是要注意,当将dict.fromkeys()
与可变对象一起使用时,不会创建副本)。在相关问题 更多 >
编程相关推荐