我的表格中有很多范围[(1, 1000), (5000, 5678), ... ]
.我正试图找出检查数字是否在任何范围内的最快方法.范围由longs
并且太大而不能保留set
所有数字.
最简单的解决方案是:
ranges = [(1,5), (10,20), (40,50)] # The real code has a few dozen ranges nums = range(1000000) %timeit [n for n in nums if any([r[0] <= n <= r[1] for r in ranges])] # 1 loops, best of 3: 5.31 s per loop
榕树有点快:
import banyan banyan_ranges = banyan.SortedSet(updator=banyan.OverlappingIntervalsUpdator) for r in ranges: banyan_ranges.add(r) %timeit [n for n in nums if len(banyan_ranges.overlap_point(n))>0] # 1 loops, best of 3: 452 ms per loop
虽然只有几十个范围,但是对这些范围进行了数百万次检查.进行这些检查的最快方法是什么?
(注意:这个问题类似于Python:有效地检查整数是否在*many*范围内,但是没有相同的Django相关限制,并且只关注速度)