0

次のような形式のログファイルがたくさんあります。

2012-09-12 23:12:00 other logs here

そして、時間文字列を抽出して、2つのログレコード間の時間デルタを比較する必要があります。私はこれでそれをしました:

for line in log:
    l = line.strip().split()
    timelist = [int(n) for n in re.split("[- :]", l[0]+' ' + l[1])]
    #now the timelist looks like [2012,9,12,23,12,0]

それから私が2つのレコードを取得したとき

d1 = datetime.datetime(timelist1[0], timelist1[1], timelist1[2], timelist1[3], timelist1[4], timelist1[5])
d2 = datetime.datetime(timelist2[0], timelist2[1], timelist2[2], timelist2[3], timelist2[4], timelist2[5])
delta = (d2-d1).seconds

問題は、実行が遅いことですが、パフォーマンスを改善する方法はありますか?よろしくお願いします。

4

3 に答える 3

2

正規表現を取り除き、次を使用できますmap

date_time = datetime.datetime

for line in log:
    date, time = line.strip().split(' ', 2)[:2]

    timelist = map(int, date.split('-') + time.split(':'))
    d = date_time(*timelist)
  • 2回までしか分割されず、空白ではなくスペースのみで分割されるため、より高速になると思い ます。.split(' ', 2).split()
  • map(int, l)[int(x) for x in l]前回チェックした時よりも速いです。
  • できれば、駆除して.strip()ください。
于 2012-09-13T03:54:56.707 に答える
1

あなたはそれを完全に正規表現で行うことができます、それはより速いかもしれません。

find_time = re.compile("^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})")

for line in log:
    timelist = find_time.match(line)
    if timelist:
        d = datetime.datetime(*map(int, timelist.groups()))
于 2012-09-13T04:02:40.607 に答える
1

のオプションの引数を使用して、正規表現なしで試すこともできますsplit

(date, time, log) = line.split(" ", 2)
timerecord = datetime.datetime.strptime(date+" "+time, "%Y-%m-%d %H:%M:%S")

そして、timedeltas連続するtimerecords の間を計算するだけの問題です

于 2012-09-13T10:03:14.147 に答える