Why is the dictionary lookup not faster in this case?(为什么在这种情况下词典查找速度不快?)
本文介绍了为什么在这种情况下词典查找速度不快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我最近询问了the fastest way to create powers of ten,结果发现最快的方法实际上有点像sneaky workaround,您首先创建所有可能的值,然后在需要的时候简单地查找它们。
在解决方案中,list
被用作查找表,然而,我刚刚了解到dicts
should be much faster当涉及到查找操作时(另请参见here)。但当我尝试使用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]
对于list
和dict
都是O(1)。不同的是key_or_value in collection
的性能。
我的列表中十的<[2-9]次方是多少?x
列表中的x
是10的次方吗?
列表的索引速度略快,因为字典需要计算其键的哈希,并检查冲突。
混淆是因为";lookup";既可以引用索引操作,也可以根据上下文检查是否存在。
这里概述了如何在列表和词典中执行相同的操作:
列表 | 词典 | |
---|---|---|
索引 | lst[i] |
dct[key] |
检查是否存在键/索引 | -len(lst) <= i < len(lst) |
key in dct |
检查值是否存在 | value in lst |
value in dct.values() |
循环遍历值 | for value in lst |
for 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() |
这篇关于为什么在这种情况下词典查找速度不快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:为什么在这种情况下词典查找速度不快?
基础教程推荐
猜你喜欢
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01