为什么在这种情况下字典查找速度不快?



我最近询问了创建十次幂的最快方法,事实证明,最快的方法实际上是一种偷偷摸摸的解决方法,首先创建所有可能的值,然后在需要时简单地查找它们。

在解决方案中,list被用作查找表,但是,我刚刚了解到,在查找操作方面,dicts应该快得多(参见此处)。但是当我尝试使用dict作为查找表时,该过程实际上更慢

n = 200
18 ns   18 ns   18 ns  f[n]  # list
22 ns   22 ns   22 ns  g[n]  # dict
n = -200
18 ns   18 ns   18 ns  f[n]  # list
29 ns   29 ns   29 ns  g[n]  # dict

为什么?这与keys是整数而不是字符串这一事实有关吗?(我也猜sets在这种情况下不能使用?

这是我运行的代码:

from timeit import repeat

solutions = [
'f[n]  # list',
'g[n]  # dict',
]
for n in 200, -200:
print(f'n = {n}')
setup = f'''
n = {n}
f = [10.0 ** i for i in [*range(309), *range(-323, 0)]]
g = {{i: 10.0 ** i for i in range(-323, 309)}}
'''
for solution in solutions:
try:
ts = sorted(repeat(solution, setup, repeat=50))[:3]
except OverflowError:
ts = [None] * 3
print(
*('%3d ns ' % (t * 1e3) if t else ' error ' for t in ts), solution
)
print()
collection[key_or_index]

对于listdict都是O(1)。不同的是key_or_value in collection的性能。

这是"我的列表中十的i次方是多少?"与"我的列表中x十的幂吗?"之间的区别。

列表的索引速度稍快,因为字典需要计算其键的哈希值,并检查冲突。


混淆是因为"查找"既可以指索引操作,也可以引用检查是否存在,具体取决于上下文。


以下是如何在列表和字典中执行等效操作的概述:

ListDictionary
索引lst[i]dct[key]
检查是否存在键/索引-len(lst) <= i < len(lst)key in dct
检查是否存在值value in lstvalue in dct.values()
循环访问值for value in lstfor value in dct.values()
循环访问键/索引for i in range(len(lst))for key in dct
循环遍历for i, value in enumerate(lst)for key, value in dct.items()

相关内容

  • 没有找到相关文章