2012-09-13 8 views
0

方式我有一樣的格式的日誌文件:更快的處理時間字符串使用python

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

,我需要提取的時間字符串,並比較兩個日誌記錄之間的時間差。 我做了這一點:

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] 

然後,當我得到了兩個記錄

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 

問題是,它的運行速度慢,反正是有提高的性能在此先感謝?

+1

哪裏是你的個人資料爲你的「緩慢運行」? –

回答

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) 
  • 認爲.split(' ', 2)將不僅僅是.split()快,因爲它只是分裂最多兩次,只在空間,而不是任何空格。
  • map(int, l)比上次檢查時的[int(x) for x in l]快。
  • 如果可以的話,擺脫.strip()
+0

對於我來說,這比標準的'datetime.strptime'大約快3倍。另一個* micro *優化是爲'datetime.datetime'分配一個新的(本地)名稱。所以,你可以做'date_time = datetime.datetime',然後使用'date_time'。這會爲你節省一個通常微不足道的字典查詢,但是通過許多訪問可以顯示出來。 – mgilson

+0

@mgilson:謝謝,我補充說。 – Blender

+0

還應該指出,局部變量技巧並不是我認爲非常受社區歡迎的技巧(大多數情況下,優化絕對不值得)。我認爲只有當它提供了可測量的加速時才應該使用,即使如此,也許很高興留下評論,說加速在特定情況下實際上是值得的。 – mgilson

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())) 
+0

我認爲你必須做'map(int,find_time.findall(line))',因爲'datetime.datetime()'只接受整數參數。 – Blender

+0

我忘了很多東西。它現在應該工作。 – grc

1

您也可以嘗試不用正則表達式,使用split

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

可選參數,然後它會是計算的事你之間連續timerecord小號timedeltas