繁体   English   中英

在大文件中有效地搜索许多不同的字符串

[英]Efficiently search for many different strings in large file

我正在尝试找到一种在文件中搜索字符串的快速方法。 首先,我没有只找到一个字符串。 我有一个包含 1900 个字符串的列表,可以在 150MB 的文件中找到。 所以基本上我正在打开一个文件,循环 1900 次以查找该文件中该字符串的所有出现。 以下是我搜索的一些属性。

  1. 要搜索的文件大小为 150mb - 它是文本文件。
  2. 我需要在一个文件中找到所有出现的 1900 个字符串。 意味着我循环 1900 次整个文件以搜索所有出现的事件。
  3. 这不是简单的搜索,我必须使用正则表达式来搜索字符串。
  4. 在少数情况下,我需要在找到搜索字符串的位置上方有一行,下方有一行。 所以我需要使用 file.readlines() 而不是 file.read()
  5. 在少数情况下,我还必须用新字符串替换搜索到的字符串。

首先,我试图找到一种在文件中搜索的最佳方法。 我的代码耗时太长。 我不确定这是否是最好的方法:

#searchstrings is list of 1900 strings
file = open("mytextfile.txt", "r")
for line in file:
    for i in range(len(searchstrings)):
        if searchstrings[i] in line:
            print(line)
file.close()

这段代码可以完成这项工作,但速度非常慢。 此外,它没有让我选择在找到搜索字符串的上方或下方的行。

我用来替换字符串的另一个代码如下所示。 这段代码也非常慢。 我在这里使用正则表达式。

file = open("mytextfile.txt", "r")
file_data = file.read()
#searchstrings is list of 1900 strings
#replacestrings is list of 1900 strings that needs to be replaced
for i in range(len(searchstrings)):
    src_str = re.compile(searchstrings[i], re.IGNORECASE)
    file_data = src_str.sub(replacestrings[i], file_data)
file.close()

我知道代码的性能也取决于计算能力,但是,我只想知道编写此代码的最佳方法是什么,它将在给定硬件的最佳速度下工作。 另外我想知道如何计时程序执行。

几点观察。

对于惯用的 Python,您通常想要

for string in searchstrings:
    ...

代替

for i in range(len(searchstrings)):
    searchstrings[i]

with open(filename) as f: ...而不是open()/close() with语句将自动关闭文件。

当您想用正则表达式替换多个字符串中的任何一个时,您可以这样做

re.sub('|'.join(YOUR_STRINGS), replacement, text)

因为| 是“或”的正则表达式符号,而不是单独循环它们。

为了性能,我可能会尝试从 CPython 切换到PyPy PyPy 是同一语言的另一种实现,但通常要快得多。

另一方面,如果这真的是你的程序应该做的所有事情,你可能想要使用专门的工具来完成这项工作,比如已经为这项工作优化过的 Ag 或 RipGrep。 如果你在 Python 工作,可能通过 subprocess.run subprocess.run() function。

我喜欢 Unix 命令,它们有趣、快速且高效。

import re, sys
map(sys.stdout.write,(string_x for string_x in sys.stdin if re.search(sys.argv[1],string_x)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM