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

fumotvh3  于 2023-03-11  发布在  Python
关注(0)|答案(2)|浏览(196)

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

_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%的搜索时间,但与搜索功能中的其他内容相比,它仍然是迄今为止最耗时的部分。
有没有其他更快的方法,或者这种类型的正则表达式解决方案对这个问题是最有效的?

cbeh67ev

cbeh67ev1#

这比我测试中的正则表达式快两倍:

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

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

mznpcxlj

mznpcxlj2#

Regex最有可能是最快的,因为大部分的“工作”都是在编译后的C代码中完成的。其他描述的选项都是纯Python的,Python中的循环比C中的循环慢得多。

相关问题