使用timeit测试字典密钥删除tim时出现Python密钥错误

2024-09-26 23:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经变得越来越累,越来越困惑,试图让这个代码工作。这是“用数据结构和算法解决问题”网络教科书中的算法分析作业。它要求比较删除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()

Tags: fromimport算法元素main时间rangelist
1条回答
网友
1楼 · 发布于 2024-09-26 23:26:57

timeit重复被测代码,但您的字典不是该代码的一部分。因此,在第一次删除之后,您将得到一个KeyError。在

您必须预先生成足够多的字典副本,然后在测试代码中选择下一个字典。对列表对象执行相同的操作,以使事情保持平稳:

delDictionary = timeit.Timer("del next(xiter)[0]",
                      "from __main__ import xiter")
delList = timeit.Timer("del next(xiter)[100]",
              "from __main__ import xiter")

# ... and in the loop

x = [list(range(i)) for _ in range(1000)]  # 1000 identical lists
xiter = iter(x)
delListTime = delList.timeit(number=1000) 
delList_list.append(delListTime)

x = [dict.fromkeys(range(i)) for _ in range(1000)]  # 1000 identical dictionaries
xiter = iter(x)

delDictTime = delDictionary.timeit(number = 1000) 
delDictionary_list.append(delDictTime) 

因此,每个测试都被赋予一个fresh列表或dictionary对象,这样比较就公平了。在

请注意,我将{j:None for j in range(i)}替换为速度更快的dict.fromkeys(range(i));后者在C代码中循环,默认值是None(但是要注意,当将dict.fromkeys()与可变对象一起使用时,不会创建副本)。在

相关问题 更多 >

    热门问题