我正在进行一项练习,比较列表和词典上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)操作。感谢您的所有建议。