从字典中删除时,timeit返回keyerror

时间:2018-01-26 16:50:06

标签: python dictionary timeit

我正在进行一项练习,比较列表和词典上del运算符的执行时间。这是代码:

from timeit import Timer
import random

random.seed(a = 42)
n_exec = 10_000

print("Total time for {} executions".format(n_exec))
for n in range(100_000, 500_000, 25_000):
    t_list = Timer("del x_list[int(0.9 * {})]".format(n), "from __main__ import n, x_list")
    x_list = list(range(n))
    time_list = t_list.timeit(number = n_exec)

    t_dict = Timer("del x_dict[int(0.9 * {})]".format(n), "from __main__ import n, x_dict")
    x_dict = {i:i*3 for i in range(n)}
    time_dict = t_dict.timeit(number = n_exec)

    print("n = {0:6d} -> list = {1:7.6f}, dict = {2:7.6f}".format(n, time_list, time_dict))

但在为字典执行时间计时时,我得到了一个更好的错误。

Total time for 10000 executions
Traceback (most recent call last):
  File "timeit_del.py", line 16, in <module>
    time_dict = t_dict.timeit(number = n_exec)
  File "C:\Users\kesha\Anaconda3\lib\timeit.py", line 178, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
KeyError: 90000

为什么键字在字典中清晰可用时会发生此键错误?我认为密钥是字典的一部分,因为我将操作从del更改为print,并将预期值打印到控制台。

编辑:感谢Patrick Haugh,我知道运行timeit 10,000次是不可能的,因为timeit一次又一次地运行相同的代码而不重复设置,所以第二次运行不会找不到上次运行中删除的密钥,提出KeyError。我尝试使用for循环平均性能时间,这是一个非常糟糕的主意,因为for循环非常慢。调用一个在其范围内创建字典的函数,del操作是另一个想法,但这可能会给结果增加一堆开销。

无论如何,重点是知道dict del是一个O(1)操作,但对于列表,事物是O(n)操作。感谢您的所有建议。

0 个答案:

没有答案