2016-05-12 193 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你会得到错误吗? –