【发布时间】:2019-03-03 07:10:03
【问题描述】:
我有一个包含费率值的 OrderedDictionary。每个条目都有一个键的日期(每个日期恰好是年度季度的开始),值是一个数字。日期按从旧到新的顺序插入。
{
date(2017, 1, 1): 95,
date(2018, 1, 1): 100,
date(2018, 6, 1): 110,
date(2018, 9, 1): 112,
}
我的费率字典比这大得多,但这是一般的想法。给定一个任意日期,我想在字典中找到 precedes 它的值。例如,查找date(2018, 8, 1) 的日期应该返回值110,因为条目date(2018, 6, 1) 是我查找日期之前最近的键。同样,date(2017, 12, 1) 的日期应该返回 95,因为最近的前面键恰好是 date(2017, 1, 1)。
我可以通过遍历字典中的项目轻松做到这一点:
def find_nearest(lookup):
nearest = None
for d, value in rates.items():
if(d > lookup):
break
nearest = value
return nearest
然而,这对我来说效率低下,因为在最坏的情况下我必须扫描整个字典(我之前提到的字典可能很大)。我将进行数以万计的此类查找,因此我希望它具有高性能。
解决性能问题的另一个选择是创建我所见内容的缓存,这也是可行的,但我想知道内存限制(我不完全确定缓存会增长多大)。
我可以在这里使用任何聪明的方法或 Python 核心模块吗?
【问题讨论】:
-
我认为你应该在这里使用二叉树(或排序列表),这样你就可以在 O(log n) 中查询。或者有一些数据结构用链表对字典进行编码,这样人们就可以获得下一个和上一个元素。
标签: python python-3.x