Python 3.x Python搜索比grep慢得多

Python 3.x Python搜索比grep慢得多,python-3.x,Python 3.x,我试图编写一个python解析器,它逐行循环遍历一个大文件,查找各种字符串,并使用分组提取字符串/数字。但是,与仅使用grep/awk提取组合相比,这样做需要很长时间 我试过了 for line in fileA: line=line.strip() obj1Match=re.search("someString\s(.*?)\sOtherstring",line,re.I) if obj1Match: obj1Extract=obj1Match.gr

我试图编写一个python解析器,它逐行循环遍历一个大文件,查找各种字符串,并使用分组提取字符串/数字。但是,与仅使用grep/awk提取组合相比,这样做需要很长时间

我试过了


for line in fileA:
    line=line.strip()
    obj1Match=re.search("someString\s(.*?)\sOtherstring",line,re.I)
    if obj1Match:

        obj1Extract=obj1Match.group(1)

    missingEMatch=re.search("ERR(.*?)\sOtherString",line)
        if missingEMatch:
            if "missingErrors" in countDict:
                countDict["missingErrors"]+=1
            else:
                countDict["missingErrors"]=1
上面只有两个例子,我有一个很长的列表,如果匹配的话,可以使用捕获组和后处理以各种方式提取,python需要花费很长时间。另一方面,使用grep/awk组合非常快


我想知道我到底做错了什么。

虽然grep会运行得更快,但您可以通过编译模式使当前的Python正则表达式代码更快

当前,每次调用search时,您都将正则表达式输入到引擎中进行解释。您可以做的是将正则表达式字符串编译成正则表达式模式对象并重新使用它。这将为您带来显著的性能提升


pattern=re.compile(“someString\s(.*)\sOtherstring”,re.I)
missingpattern=re.compile(“ERR(.*)\sOtherString”)
对于文件A中的行:
line=line.strip()
obj1Match=模式搜索(行)
如果匹配:
obj1Extract=obj1Match.group(1)
missingEMatch=missingpattern.search(行)
如果不匹配:
如果countDict中出现“missingErrors”:
countDict[“missingerors”]+=1
其他:
countDict[“missingerors”]=1

很好,Python被解释为AIK,而
grep
awk
直接在Linux上运行,更接近操作系统。我并不奇怪像
grep
这样的本机函数会比Python表现得更好。顺便说一句,它不是
re.search()
慢的一点,它是
for
循环,你在整个输入上试过了吗?你能解释一下你在整个输入上试过它是什么意思吗?我执行readLines()并读取整个文件,然后读取列表上的regex?我假设norok在这里假设您正在运行s来比较re.search和grep/awk之间的执行时间,并且您可能没有对整个文件内容(grep/awk是这样做的)运行re.search,并且一次只在文件内容的一行上运行它。从本质上看,您似乎没有比较类似的情况。如果你给出一些实际的数字也会有帮助;比如文件的大小、行数、每次运行所需的时间(grep/awk与re.search),这些都有几秒钟的帮助,但不会太大。我认为for循环是这里的问题