Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取字符串中所有换行符位置的快速方法_Python_Search - Fatal编程技术网

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

Python 获取字符串中所有换行符位置的快速方法,python,search,Python,Search,我正在编写一个搜索函数来查找字符串中所有出现的模式。我需要的输出之一是匹配当前行上的位置。为此,我找到了换行符的所有位置,并使用匹配位置和换行符位置来获得换行符位置。我现在遇到的问题是获得新线职位。因为我将定期处理大型文件,所以我需要尽可能高效。我试过几种不同的方法来解决这个问题。第一个是: _newline_positions = [] for _index, _char in enumerate(string): if _char == "\n": _newline_

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

_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
它是最短和最有效的,只占用了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扩展名,或者甚至可能只使用cython,那么与第一个解决方案相当的解决方案将是最快的,我预计与Python的同类产品相比,速度会提高20到100倍。@MatteoItalia是的,这也是我的猜测。我认为不会有比正则表达式更快的Python解决方案。。。在Cython中应该相对简单。@user2357112问题是我还需要绝对位置,现在我发现我忽略了提到它。对此我深表歉意。然而,即使我没有这样做,拆分一个大文件的速度不是很慢吗?或者我误解了你的建议吗?我尝试过这个方法,但在我的情况下速度慢了大约2倍。也许我需要改变我一直在使用的分析方法……在做了一点更多的工作后,我发现虽然你给出的方法看起来没有更快,但它为我提供了足够的信息来删除我的大部分代码,将我复杂的搜索变成了一个非常简单的双循环解决方案。总的来说,与我以前的解决方案相比,我在大文件上增加了大约5倍。可能是我的测试方法需要改变。小文件中的小样本量。
with open(file) as f:
  newline_positions = [-1]
  for v in f:
     newline_positions.append(newline_positions[-1]+len(v))
  print(newline_positions[1:])