Eli*_*hle 4 python performance dictionary
我有一个很大的查找表,其中的键是一个间隔:
| min | max | value |
|-----|-----|---------|
| 0 | 3 | "Hello" |
| 4 | 5 | "World" |
| 6 | 6 | "!" |
| ... | ... | ... |
Run Code Online (Sandbox Code Playgroud)
目标是创建一个查找结构my_lookup,根据整数所在的范围返回每个整数的值。例如:2 -> "Hello", 3 -> "Hello", 4 -> "World"。
这是一个实现我想要的功能的实现:
d = {
(0, 3): "Hello",
(4, 5): "World",
(6, 6): "!"
}
def my_lookup(i: int) -> str:
for key, value in d.items():
if key[0] <= i <= key[1]:
return value
Run Code Online (Sandbox Code Playgroud)
但是循环遍历所有条目似乎效率很低(实际的查找表包含 400.000 行)。有更快的方法吗?
如果您的间隔已排序(按升序),您可以使用bisect模块(doc)。搜索是 O(log n) 而不是 O(n):
min_lst = [0, 4, 6]
max_lst = [3, 5, 6]
values = ['Hello', 'World', '!']
import bisect
val = 2
idx = bisect.bisect_left(max_lst, val)
if idx < len(max_lst) and min_lst[idx] <= val <= max_lst[idx]:
print('Value found ->', values[idx])
else:
print('Value not found')
Run Code Online (Sandbox Code Playgroud)
印刷:
Value found -> Hello
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1319 次 |
| 最近记录: |