我正在写一个搜索函数来查找字符串中出现的所有模式。我需要的输出之一是匹配在当前行的位置。为此,我找到了所有换行符的位置,并使用匹配位置沿着换行符位置来获取行位置。我遇到的问题是获取换行符位置。因为我经常要处理大文件,所以我需要尽可能地提高效率。我尝试了几种不同的方法来解决这个问题。第一种方法是:
_newline_positions = []
for _index, _char in enumerate(string):
if _char == "\n":
_newline_positions.append(_index)
它是迄今为止最慢的,仅这一部分就占用了近80%的运行时间。
接下来,我尝试了这个方法,这与我实际实现模式搜索的方式类似。
_newline_positions = []
while _position < len(string):
_position = string.find("\n", _position)
if _position != -1:
_newline_positions.append(_position)
else:
break
_position += 1
这比第一次尝试更有效率,但它只减少了大约20%的时间百分比,减少到大约60%。
最后我尝试了一个解决方案,我发现使用regex:
_newline_positions = [match.start() for match in re.finditer("\n", string)]
它是最短和最有效的,只占用40%的搜索时间,但与搜索功能中的其他内容相比,它仍然是迄今为止最耗时的部分。
有没有其他更快的方法,或者这种类型的正则表达式解决方案对这个问题是最有效的?
2条答案
按热度按时间cbeh67ev1#
这比我测试中的正则表达式快两倍:
它确实需要对文件中的所有行进行迭代,这对您可能有用,也可能没有用。
mznpcxlj2#
Regex最有可能是最快的,因为大部分的“工作”都是在编译后的C代码中完成的。其他描述的选项都是纯Python的,Python中的循环比C中的循环慢得多。