慢python解析脚本

2024-10-04 09:19:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了一个简单的脚本,它应该逐行扫描一个文件,然后匹配两个不同的正则表达式来重新格式化数据。它的工作原理如下:

with open(file) as f:
    for line in f:
        line = line.rstrip('\n')
        parseA(line, anOutPutFile) or parseB(line, anOutPutFile) or parseC(line, anOutPutFile) or parseD(line, anOutPutFile)

每一行可以是A、B、C、D行中的一行,也可以是无行(其中大多数匹配A,第二常见的是B等),下面是parseX函数的示例:

^{pr2}$

我希望'or'运算符的短路会有所帮助,但是脚本在大文件(例如,大小为~1G的文件)上仍然非常慢,我想知道是否有任何明显和简单的东西可以开始修改,但效率非常低。例如重新编译(但是文档说最近的regexp被缓存了,而我只有一小部分)?在

谢谢

基于以下评论

我先将代码改为使用join,然后改为使用重新编译两人似乎都没有加快这一进程。它运行在一个有50000行的测试文件上,大约需要93秒左右。这也是它之前在这个测试文件中所做的。我在每个正则表达式中有8到12个组,其中有5个。我把代码改成了:

regexA = re.compile('.*0' + bla + ' A ' + '.*\((\d+)\) (\d+) (\w+) (\d+)@(.+) .* (.*) .* .* foo=far fox=(.*) test .*')
regexB = re.compile(#similar)
regexC = re.compile('.*0' + bla + ' C ' + '.*\((\d+)\) (\d+) (\w+) (\d+)@(.+) foo=(\d+) foo2=(\d+) foo3=(\d+)@(.+) (\w+) .* (.*) .* .* foo4=val foo5=(.*) val2 .*')
regexD = re.compile(#similar)
regexE = re.compile(#similar)

#include two of the regex above fully to get an idea of what they look like
#now this is an example of one of the parse funcs for regexA

def parseA(line,anOutputFile):
    m = regexA.match(line)
    if m:
        out = ''.join(['A',',',m.group(1),',',m.group(2),',',#etc])
        anOutputFile.write(out)
        return True
    else:
        return False

也许加入名单不是你的意思?在顶层编译5个regexp也没用。在


Tags: or文件of代码re脚本forline
2条回答

在没有if的情况下,所有parseA、parseB调用或“ed”仍然会执行它们中的每一个。在行首放一个if,然后在必要时执行pass,以防止在前一个成功时执行下一个parseX函数,或者创建一个ifs树。在

您是否考虑过将文件写入移出函数并进行简化,因为它们看起来都是一样的。在

以行和已编译的正则表达式作为参数的解析函数。在

def parse(line, regex, label):
    m = regex.match(line)
    if m:
        return ','.join([label] + m.groups())

然后文件写入可以在主循环中进行

^{pr2}$

相关问题 更多 >