1

interval数日前の最も古い日付のインデックスを選択する必要がありますdate1( index を使用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)])

これはさらに遅いです。

4

1 に答える 1

1

intervaldate1 の数日前の最も古い日付のインデックスを選択する必要があります( index を使用i1)。ソートされたリストがありますdates

二分探索の使用 (O(log n)時間計算量):

import bisect

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

Paraphrasing bisect's documentation : 戻り値iは、スライス内のすべての日付が( )日以上前であり、スライス内のすべての日付dates[:i]がそれよりも前または正確に( )日前であるようなものです。>intervaldate[i1]dates[i:]<=intervaldates[i1]

于 2013-11-14T02:13:28.987 に答える