我有一个包含整数的列表:candidates = [1, 2, 3, 4, 5, 16, 20]
。这个列表可能包含超过100万个项。
我有一个字典number_ranges
,它的键是一个整数,值是一个包含最小值和最大值范围对象的列表。当前该字典包含约500k个键。
{
{5: [{"start": 0, "end": 9}]},
{16: [{"start": 15, "end": 20}, {"start": 16, "end": 18}]}
}
我现在正在遍历这个列表:
for candidate in candidates:
number = search_in_range(candidate, number_ranges)
我检查number_ranges
中的范围是否有与candidates
相匹配的数字,如果有,就返回将在后续使用的键。
def search_in_range(candidate, number_ranges):
for number_range_key in number_ranges:
for number in number_ranges[number_range_key]:
if int(number['start']) <= candidate <= int(number['end']):
return {"key": number_range_key, "candidate": candidate}
当我运行这个程序时,我发现处理1000个数字需要大约40秒的时间。这意味着如果我有100万个数字,我需要超过11个小时才能完成处理。
('2018-12-19 16:22:47', 'Read', 1000)
('2018-12-19 16:23:30', 'Read', 2000)
('2018-12-19 16:24:10', 'Read', 3000)
('2018-12-19 16:24:46', 'Read', 4000)
('2018-12-19 16:25:26', 'Read', 5000)
('2018-12-19 16:25:59', 'Read', 6000)
('2018-12-19 16:26:39', 'Read', 7000)
('2018-12-19 16:27:28', 'Read', 8000)
('2018-12-19 16:28:15', 'Read', 9000)
('2018-12-19 16:28:57', 'Read', 10000)
期望的输出是从
number_ranges
中返回匹配范围内和用于查找该键的candidate
数字的键,即在函数 search_in_range
中返回 {"key": number_range_key, "candidate": candidate}。在Python中,有哪些推荐的方法来优化此算法?
key:16
只需要检查它是否在 15 到 20 之间一次即可。此外,如果你有一个键包含了 15 到 18 和 18 到 25 的情况,那么将它们合并成 15 到 25。 - CodeCollectordict
对象会直接迭代键。实际上,在 Python 2 中,for key in my_dict.keys()
是一种反模式,而在 Python 3 中我仍然认为它是多余的。 - juanpa.arrivillagafor number_range_key, number_range_value in number_ranges.items():
更好,因为它可以避免另一个 O(1) 的查找。 - Stuart Buckingham