I have sorted lists of starting times and ending times. I also have a very large sorted list of times, t.
Right now, I am doing the extremely slow:
for start, end in zip(startTimes, endTimes):
for time in t:
if start <= t <= end:
do something
This looks at each element in t every single time. I know I can reduce this by making some elifs for whether or not t < start or end < t, but there must be a way to take advantage of the lists being sorted.
>Solution :
Suppose you have a 1,000,000 day interval in list t:
import datetime as dt
st=dt.datetime(1990, 1, 1)
t=[st]
for i in range(1_000_000):
t.append(t[-1]+dt.timedelta(days=1))
>>> t[-1]
4727-11-29 00:00:00 # if man is still alive...
You can use itertools groupby to find sub intervals:
from itertools import groupby
x=dt.datetime(2040,2,2)
y=dt.datetime(2040,2,6)
for k,v in groupby(t, key=lambda d: x<=d<=y):
if k:
print(list(v))
Prints:
[datetime.datetime(2040, 2, 2, 0, 0), datetime.datetime(2040, 2, 3, 0, 0), datetime.datetime(2040, 2, 4, 0, 0), datetime.datetime(2040, 2, 5, 0, 0), datetime.datetime(2040, 2, 6, 0, 0)]
On my little laptop that is nearly instant.