2009-08-26 3 views
2

Я использую модуль python dateutil для приложения календаря, которое поддерживает повторяющиеся события. Мне очень нравится возможность анализировать правила, используя функцию rrulestr(). Кроме того, использование rrule.between() для получения дат в заданном интервале очень быстро.Python dateutil.rrule невероятно медленный

Однако, как только я попытаюсь выполнить любые другие операции (то есть: список фрагментов, before(), after(), ...), все начинает сканирование. Кажется, что dateutil пытается рассчитать каждую дату, даже если все, что я хочу, - это получить последнюю дату с rrule.before (datetime.max).

Есть ли способ избежать этих ненужных вычислений?

ответ

4

Мое предположение, вероятно, нет. Последняя дата перед datetime.max означает, что вам нужно рассчитать все повторения до datetime.max, и это будет разумно большим количеством повторений. Возможно, можно добавить ярлыки для некоторых более простых повторений. Например, если это каждый год в одну и ту же дату, вам не нужно, например, вычислять повторения между ними. Но если у вас есть что-то третье, что вы должны, например, и, если у вас есть максимальные повторения, и т. Д. Но, я думаю, у dateutil нет этих ярлыков. Вероятно, было бы довольно сложно реализовать надежно.

Могу ли я спросить, почему вам нужно найти последний повтор перед datetime.max? Это, в конце концов, почти восемь тысяч лет в будущем ... :-)

+0

Я храню события в базе данных и хотел бы запросить события между определенными датами (то есть: начало и конец месяца) , Если я могу сохранить первую и последнюю даты, я мог бы исключить все события, которые не «перекрываются» с заданным интервалом времени, уменьшая количество событий, для которых я должен вызвать rrule.between(). – pklall

+0

С другой стороны, я думаю, что добавление щедрого максимального «подсчета» к каждому рублю устранит проблему. – pklall

+0

Я обычно исправляю это с помощью щедрой максимальной даты, например, 20 лет в будущем. 8000 лет кажется излишним. Также вы можете иметь специальную обработку для дат, у которых нет даты окончания или окончания, так как вы знаете, что по определению они никогда не кончатся, поэтому они * будут * перекрываться. :) –