1
\$\begingroup\$

I want to search for positions inside a range of integers. How to improve the code in terms of efficiency, since both my search list and the ranges are very big:

#Range list with ids
range_lst = [(121000, 122000, 'foo'), (123456, 124557, 'bar'), (156789, 163659, 'egg')]
# Positions which we want to scan
pos = [123456, 369369]
# Neighbouring windows size
window_size = 10000

for p in pos:
    for r in range_lst:
        range_area = range(r[0], r[1])
        range_area_window = range(r[0]-window_size, r[1]+window_size)
        id = r[2]
        if p in range_area:
            print (p, id, 'exact hit!')
        else:
            # If we don't find an exact hit, we check the neighbouring region +- 10000
            if p in range_area_window:
                print (p, id, 'neighbour hit!')
\$\endgroup\$
0

1 Answer 1

3
\$\begingroup\$

I think that having a range is not necessary here. If you're only comparing against integer ranges, simple \$ \le \$ and \$ \ge \$ comparisons should suffice.

So, the following function is essentially the same:

def search_position(ranges, positions, window_size=10000):
    for low, high, range_id in ranges:
        for pos in positions:
            if low <= pos < high:
                print(pos, range_id, 'exact hit!')
            elif (low - window_size) <= pos < (high + window_size):
                print(pos, range_id, 'neighbour hit!')
\$\endgroup\$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.