【问题标题】:Python dateutil.rrule is incredibly slowPython dateutil.rrule 非常慢
【发布时间】:2009-08-26 19:03:10
【问题描述】:

我正在将 python dateutil 模块用于支持重复事件的日历应用程序。我真的很喜欢使用 rrulestr() 函数解析 ical rrules 的能力。此外,使用 rrule.between() 获取给定时间间隔内的日期非常快。

但是,一旦我尝试执行任何其他操作(即:列表切片、before()、after()、...),一切都会开始爬行。似乎 dateutil 尝试计算每个日期,即使我只想使用 rrule.before(datetime.max) 获取最后一个日期。

有没有办法避免这些不必要的计算?

【问题讨论】:

    标签: python calendar icalendar python-dateutil


    【解决方案1】:

    我的猜测可能不是。 datetime.max 之前的最后一个日期意味着您必须计算直到 datetime.max 的所有重复,这将是合理的很多重复。可以为一些更简单的重复添加快捷方式。例如,如果每年都在同一日期,那么您实际上不需要计算其间的重复次数。但是,如果你有三分之一的东西你必须,例如,如果你有最大的重复次数等等。但我猜 dateutil 没有这些快捷方式。可靠地实现可能会相当复杂。

    请问为什么需要在 datetime.max 之前找到最后一次重复?毕竟,这是将近八千年后的未来...... :-)

    【讨论】:

    • 我将事件存储在数据库中,并希望查询特定日期(即:月初和月底)之间的事件。如果我可以存储第一个和最后一个日期,我可以消除所有不与给定时间间隔“重叠”的事件,从而减少我必须调用 rrule.between() 的事件数量。
    • 再想一想,我认为为每个规则添加一个慷慨的最大“计数”可以解决问题。
    • 我通常会在一个慷慨的最大日期之前解决这个问题,比如未来 20 年。 8000年似乎有点过头了。您还可以对没有计数或结束日期的日期进行特殊处理,因为您知道根据定义,这些日期永远不会结束,因此它们重叠。 :)
    • @User No,作为 iCalendar RRULE 字符串。但腌制可能会起作用。
    • @User:单独的字段,因为它们需要被索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2012-10-29
    • 2016-10-10
    相关资源
    最近更新 更多