【问题标题】:Python dateutil.rrule skip every nth occurrencePython dateutil.rrule 跳过每第 n 次出现
【发布时间】:2017-07-16 00:12:54
【问题描述】:
很容易得到dateutil.rrule.rrule实例的第n次出现:
rule = dateutil.rrule.rrule(...)
occurrence = rule[15]
...但是我遇到了occurrence in rule is True;我想知道它是哪个事件(即事件的索引,在上面的示例中为 15),而不会导致性能问题,因为我可能需要对很多事件执行此操作。
这可能吗?如果可以,如何做到?
【问题讨论】:
标签:
python-3.x
python-dateutil
【解决方案1】:
我不知道有一种方法可以让您使用当前函数集对值运行测试。
但是,根据您执行计算的频率,您可以考虑执行以下操作:
- 使用
cache feature:
cache – 如果给定,它必须是一个布尔值,指定启用或
禁用结果缓存。如果您将使用相同的 rrule 实例
多次,启用缓存将提高性能
相当大。
- 将结果重新映射到 numpy 数组以获得最佳索引分辨率:
鉴于r 是一大组结果:
>>> r # Your result set
<dateutil.rrule.rrule object at 0x7f616d4182e8>
>>> r[1] # Example of what's inside
datetime.datetime(2015, 1, 1, 0, 0)
>>> import numpy as np # Let's load numpy
>>> a = np.array(list(r)) # We build a numpy array, should be fast
>>> np.argwhere(a == datetime.datetime(2015, 1, 1, 0, 0)) # Catch'em all!
array([[1]])
我不确定np.argwhere() 是否会比使用简单循环遍历结果集更快,但这是一种更易读的方法。