快速将日期范围与Python日期列表中的索引匹配

时间:2013-11-14 00:29:14

标签: python list datetime python-2.7

我需要选择最早日期的索引,该日期不超过intervaldate1天(索引i1)。我有一个排序列表dates,这是我正在尝试做的事情的片段:

for i1 in mylist:
    date1 = dates[i1]
    i0 = sum(1 for d in dates if date1 - d > timedelta(days = interval))
    # do some other stuff with this

我找到i0的行似乎是此循环的瓶颈,因为如果我将其更改为i0 = max(0, i1 - 30)(它只是忽略缺少的日期),它的工作速度大约快100倍。

有没有办法加快速度?我觉得应该有一种方法可以使用列表排序的事实,避免进行所有的比较。


PS:我的第一次尝试是:

i0 = len([d for d in dates if date1 - d > timedelta(days = interval)])

甚至更慢。

1 个答案:

答案 0 :(得分:1)

  

我需要选择最早日期的索引,该日期不超过date1之前的interval天(索引为i1)。我有一个排序列表dates

使用二分搜索(O(log n)时间复杂度):

import bisect

i = bisect.bisect_left(dates, dates[i1]-timedelta(days=interval))

释义bisect's documentation:返回值i使得切片dates[:i]中的所有日期都多于>){{在interval之前的1}天,并且切片date[i1]中的所有日期都小于或完全dates[i:]<=天前interval 1}}。

相关问题