Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 输出打印速度慢_Python_Python 2.7_Python 3.x_Ipython - Fatal编程技术网

Python 输出打印速度慢

Python 输出打印速度慢,python,python-2.7,python-3.x,ipython,Python,Python 2.7,Python 3.x,Ipython,我正在写一个脚本,这部分代码使我的脚本输出打印速度变慢。我认为是嵌套循环导致了这个问题(这里使用了字典概念)。有没有其他方法可以让我的脚本在不等待的情况下打印结果 Log = open("file.txt") for LogLine in Log: flag = True for key, ConfLine in Conf.items(): for patterns in ConfLine: patterns = DateString +

我正在写一个脚本,这部分代码使我的脚本输出打印速度变慢。我认为是嵌套循环导致了这个问题(这里使用了字典概念)。有没有其他方法可以让我的脚本在不等待的情况下打印结果

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

尝试以下方法。它会给你很大的速度。对Python2.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())    

如果我误读了逻辑并且不起作用,请评论

cpanda的答案是好的,但是一个充满
的正则表达式是否是尝试所有正则表达式的最快方法并不明显。测试此备选方案的性能:

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())
在旁注中,这里介绍了如何使用干净的
中断
编写当前代码,而不需要使用
标志

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

您在
Conf.items()
中所指的
Conf
是什么?它的定义词典我认为您的第一个词典和我的词典实际上是等价的。我正在交替并提交给正则表达式引擎,这里python正在评估
。这是我从比利那里学到的。:)@事实上,它们是等价的。我一开始就想表达出来。一个可能更快,我不知道是哪一个。你当然做了优化的重要部分。OP现在也了解了有价值的
任何
。罗杰。我的目的是简洁。@AlexHall Roger@C Panda,因为我在比较日志文件。你认为是日志文件的大小让它变慢了吗?也感谢你介绍了一些,我在代码中实现了它。@PukhrajSingh不。这不是一个因素,只要你使用迭代器(
log
),而不是列表(
log.splitlines()
)或一个大字符串(
log.read()
)。如果文件为100MB,则每次在内存中处理一行文本。但这就是Python3.x,请检查Python2.x中的
open
返回的内容。Python2中的文件也是惰性迭代器,这一点没有改变。