我有一个包含~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
目前这些观察需要很长时间。但由于记忆的考虑,我也不想生成一个包含开始和停止之间所有位置的更快的集合。
您是否有任何指示如何创建快速启动,结束位置数据结构或更好的查找策略?
答案 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()