[英]Efficiently search for many different strings in large file
我正在尝试找到一种在文件中搜索字符串的快速方法。 首先,我没有只找到一个字符串。 我有一个包含 1900 个字符串的列表,可以在 150MB 的文件中找到。 所以基本上我正在打开一个文件,循环 1900 次以查找该文件中该字符串的所有出现。 以下是我搜索的一些属性。
首先,我试图找到一种在文件中搜索的最佳方法。 我的代码耗时太长。 我不确定这是否是最好的方法:
#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.