Поле битовой карты, упомянутое другим респондентом, было бы невероятно эффективным, но оно становится беспорядочным, если вы хотите иметь возможность обрабатывать получас или четверть часа, поскольку вам необходимо арифметически увеличивать количество битов и структуру поле каждый раз, когда вы сталкиваетесь с новым разрешением, которое вы должны соответствовать.
Вместо этого я бы попытался сохранить значения как datetime внутри списка:
openclosings = [ open1, close1, open2, close2, ... ]
Тогда я бы использовал функцию Python "bisect_right ()" во встроенном модуле "bisect", чтобы за короткое время O (log n) найти, где в этом списке "подходит" время вашего запроса. Затем посмотрите на индекс, который возвращается. Если это четное число (0, 2, 4 ...), то время находится между одним из «закрытых» и следующим «открытым» временем, поэтому магазин закрывается. Если вместо этого индекс деления пополам представляет собой нечетное число (1, 3, 5 ...), то время между временем открытия и закрытия и магазин открыт.
Не так быстро, как растровые изображения, но вам не нужно беспокоиться о разрешении, и я не могу придумать другое решение O (log n), которое столь же элегантно.