2016-05-12 194 views
-1

我正在寫一個腳本,這部分代碼正在讓我的腳本輸出打印慢。我認爲它是導致問題的嵌套循環(在那裏使用詞典概念)。有沒有其他方法可以讓我的腳本無需等待而打印結果。輸出打印慢

Log = open("file.txt") 
for LogLine in Log: 
    flag = True 
    for key, ConfLine in Conf.items(): 
     for patterns in ConfLine: 
      patterns = DateString + patterns 
      if re.match(patterns, LogLine): 
       flag = False 
       break 
     if(flag == False): 
      break 
    if(flag): 
     print LogLine.strip() 
+0

是什麼'Conf'你在'Conf.items()'中提到? – Tanu

+0

其定義字典 –

回答

1

C熊貓的答案很好,但並不是很明顯,一個正則表達式充滿|是嘗試所有正則表達式的最快方法。測試這種替代的性能:

pats = [re.compile(date_string+pat) for conf in Conf.values() for pat in conf] 

with open('file.txt') as log: 
    for line in log: 
     if any(pat.match(line) for pat in pats): 
      print(line.strip()) 

在一個側面說明,這裏是如何您當前的代碼可以用乾淨的break寫入,且無需flag

for ConfLine, patterns in ((c, p) for c in Conf.values() for p in c): 
    patterns = DateString + patterns 
    if re.match(patterns, LogLine): 
     break 
else: 
    print LogLine.strip() 
+0

我想認爲你的第一個和我的實際上是等效的。我交替並提交給正則表達式引擎,這裏python正在評估'或'。我從* Bealey *瞭解到。 :) –

+1

@CPanda確實,它們是等價的。我試圖在一開始就表達這一點。一個可能會更快,我不知道哪個。你當然做了優化的重要部分。此外,OP現在已經瞭解到任何有價值的「任何」。 –

+0

羅傑。我渴望簡潔。 –

1

請嘗試以下操作。它會給你很大的加速。適用於Python 2.x的適當更改

pats = (date_string+pat for conf in Conf.values() for pat in conf) 
master_pat = re.compile('|'.join(pats)) 

with open('file.txt') as log: 
    for line in log: 
     if master_pat.match(line): 
      print(line.strip())  

如果我誤讀了邏輯並且無法正常工作,請發表評論。

+0

@AlexHall羅傑。 –

+0

它不起作用 –

+0

@PukhrajSingh你會得到錯誤嗎? –