获取字符串中所有换行符位置的快速方法



我正在编写一个搜索函数来查找字符串中模式的所有出现。我需要的输出之一是匹配当前行上的位置。为此,我找到了换行符的所有位置,并使用匹配位置和换行符位置来获取行位置。我遇到的问题是获得换行符位置。因为我经常要处理大文件,所以我需要尽可能高效。我已经尝试了几种不同的方法来解决这个问题。第一个是:

_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% 左右。

最后,我尝试了使用正则表达式找到的解决方案:

_newline_positions = [match.start() for match in re.finditer("n", string)]

它是最短和最有效的,仅占用40%的搜索时间,但与搜索功能中的其他所有内容相比,它仍然是迄今为止最耗时的部分。

有没有其他方法可以更快地做到这一点,或者这种类型的正则表达式解决方案是解决此问题最有效的方法?

这大约是我测试中的正则表达式的两倍:

with open(file) as f:
newline_positions = [-1]
for v in f:
newline_positions.append(newline_positions[-1]+len(v))
print(newline_positions[1:])

它确实需要对文件中的所有行进行迭代,这可能对您有用,也可能没有用。

正则表达式很可能是最快的,因为大部分"工作"都是在编译的 C 代码中完成的。描述的其他选项是纯python,在Python中循环比在C中循环要慢得多。

最新更新