快速查找间隔列表

时间:2014-07-20 13:23:30

标签: python

我有一个包含~280.000元素的起始位置列表。完全覆盖约73.000.000个职位。

出于性能原因,我已将它们分成字典中的部分(通过子集化因子),而这些部分又包含元组列表(开始,结束)。

最后我得到一个位置列表,我想测试它们是否位于开始和结束的区域中。

posit = (start,end)
dict[subset].append(posit)

for position in dict[subset]:
    if posit[0] < varpos < posit[1]:
    # do some stuff here 

目前这些观察需要很长时间。但由于记忆的考虑,我也不想生成一个包含开始和停止之间所有位置的更快的集合。

您是否有任何指示如何创建快速启动,结束位置数据结构或更好的查找策略?

1 个答案:

答案 0 :(得分:0)

我的假设是范围不重叠,280000范围对象不会定期更改。我的第一直觉是使用排序的列表列表而不是字典对象列表。然后我会导入位置列表并将它们传递给一个&lt; findRange&#39;方法。

为了测试我的实现,我生成了280000个列表的排序列表。然后通过了1000个随机可能的位置匹配&#39;到findRange进行匹配。

对于100个可能的位置匹配,这个实现需要7.260579秒。 1000&#39; possiblePositionMatches&#39;和

的71.96268秒
import random
import time

values = list()
for a in range(0,73000000,250) :
    values.append([a, a+200])

possiblePositionMatches = list()
count = 1000
while count:
    count = count - 1
    possiblePositionMatches.append(random.randint(0,73000000))

matches = []

def findRange(value) :
    for x in range(len(values)) :
        if (value >= values[x][0]) and (value < values[x][1]) :
            matches.append([value, values[x]])

def main():
    t1 = time.process_time()
    for y in possiblePositionMatches: 
        findRange(y)
    print (matches)
    t2 = time.process_time() - t1
    print("Total Time: {0} seconds".format(t2))

main()