我需要选择最早日期的索引,该日期不超过interval
前date1
天(索引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)])
甚至更慢。
答案 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}}。