大文本文件中的超高速regexmatch

时间:2016-07-16 12:00:14

标签: python

我希望这段代码能够快速运行。

import re
with open('largetextfile.txt') as f:
    for line in f:
        pattern = re.compile("^1234567")
        if pattern.match(line):
            print (line)

需要19秒。

我修改了它:

import re
with open('largetextfile.txt') as f:
    for line in f:
        if "1234567" in line:
            pattern = re.compile("^1234567")
            if pattern.match(line):
                print (line)

需要7秒钟。

所以问题是,还有更好的方法吗?

我从社区得到了两个想法,基于此我在https://codereview.stackexchange.com/questions/135159/python-search-for-array-in-large-text-file

询问了详细问题

3 个答案:

答案 0 :(得分:4)

检查这是否符合您的要求:

with open('largetextfile.txt') as f:
    for line in f:
        if line.startswith('1234567'):
            print line

答案 1 :(得分:1)

由于您不匹配字符串,因此您不需要正则表达式,因此您可以使用此

with open('bigfile.txt') as f:
    for line in f:     
        if line[:7]=="1234567": 
            print (line)

我注意到使用字符串切片比startswith略快,并且发现这已经讨论过here

答案 2 :(得分:1)

为了执行测试,我在文件 AAA.txt 中复制了以下文本:6,31 MB和大约128.000行:
http://norvig.com/big.txt
然后在随机模块的帮助下,我通过在1000行的开头随机插入'1234567'将其更改为文件 BBB.txt

我在这个修改后的文本上测试了几个解决方案。

我不能区分以下哪一项最快,但我认为它们比我在本页和其他解决方案中读到的其他解决方案更快。

它们基于"" -test 'string' in 'anotherstring'非常快。

def in_and_startswith(x):
    return '1234567' in x and x.startswith('1234567')
with open('BBB.txt') as f:
    for line in filter(in_and_startswith, f):
        x=0

def in_and_find(x):
    return '1234567' in x and x.find('1234567')==0
with open('BBB.txt') as f:
    for line in filter(in_and_find, f):
        x=0

def just_in(x):
    return '1234567' in x

with open('BBB.txt') as f:
    for line in filter(just_in, f):
        if line.startswith('1234567'):
            x=0

with open('BBB.txt') as f:
    for line in filter(just_in, f):
        if line.find('1234567')==0:
            x=0

请注意,我仅使用没有特别意义的指令x=0进行测试,以避免指令print(line),因为print()是一条需要很长时间才能执行的指令。 所以重复几个print()指令要比打印一个字符串要长得多,因为它连接了所有必须打印的字符串。

测试

的执行时间
for x in ['hkjh','kjhoi','3135487j','kjhskdkfh','54545779']:
    print(x)

print('\n'.join(x for x i['hkjh','kjhoi','313587j','kjhskdkfh','54545779']))

你会看到差异