我首先想到的是具有正则表达式引擎采取的处理这一切的麻烦。它们通常被优化来处理大量的文本,所以它不应该成为性能问题。这是蛮力,但表现似乎没问题。你可以将输入分成几部分,并有多个进程处理它们。这是我经过适度测试的解决方案(使用Python)。
import random
import string
import re
def create_random_sentence():
nwords = random.randint(4, 10)
sentence = []
for i in range(nwords):
sentence.append("".join(random.choice(string.lowercase) for x in range(random.randint(3,10))))
ret = " ".join(sentence)
print ret
return ret
patterns = [ r"Hi there, [a-zA-Z]+.",
r"What a lovely day today!",
r"Lovely sunset today, [a-zA-Z]+, isn't it?",
r"Will you be meeting [a-zA-Z]+ today, [a-zA-Z]+\?"]
for i in range(95):
patterns.append(create_random_sentence())
monster_pattern = "|".join("(%s)"%x for x in patterns)
print monster_pattern
print "--------------"
monster_regexp = re.compile(monster_pattern)
inputs = ["Hi there, John.",
"What a lovely day today!",
"Lovely sunset today, John, isn't it?",
"Will you be meeting Linda today, John?",
"Goobledigoock"]*2000
for i in inputs:
ret = monster_regexp.search(i)
if ret:
print ".",
else:
print "x",
我创建了一百个模式。这是python regexp库的最大限制。其中4个是你的实际例子,其余的都是随机句,只是为了强调一点。
然后我将它们组合成一个包含100个组的单个正则表达式。 (group1)|(group2)|(group3)|...
。我猜你必须对正则表达式中的含义进行消毒处理(如?
等)。这是monster_regexp
。
根据此测试一个字符串在单次测试中对100个模式进行测试。有一些方法可以找出匹配的确切组。我测试了10000个字符串,其中80%应该匹配,10%不会。它缩短了成本,所以如果取得成功,它会比较快。失败将不得不贯穿整个正则表达式,所以它会变慢。您可以根据输入频率排序,以获得更多性能。
我在我的机器上运行了这个,这是我的计时。
python /tmp/scratch.py 0.13s user 0.00s system 97% cpu 0.136 total
这是不是太糟糕。
但是,要对这么大的正则表达式的模式和失败将需要更长的时间,所以我改变了输入有大量随机生成的字符串,将不匹配,然后尝试的。 10000个字符串,其中没有一个匹配monster_regexp,我得到了这个。
python /tmp/scratch.py 3.76s user 0.01s system 99% cpu 3.779 total
要求的性能是什么?对1500个字符串的正则表达式不可能是地球上最快的东西......你可以从一些字符开始,也许只是第一个字符(不包括空格),然后传递给正则表达式。 – lunadir 2013-05-07 06:47:34
@lunadir表演必须是一流的。我必须每秒处理大约6000个这样的字符串,但我可以使用多个进程。我已经保持了性能,因为我希望首先有一个基本的工作解决方案。 – 2013-05-07 06:54:45
@lunadir此外,它不需要是一个正则表达式。它可以是1500个不同的正则表达式以及一些if/else语句,如果这有助于获得更好的性能,则在JS中的预生成函数(由new function创建)内运行。 – 2013-05-07 06:56:23