我有大约5000个文件,我需要从10000个单词的列表中找到每个单词。我当前的代码使用一个(非常)长的regex来完成它,但是它非常慢。在
wordlist = [...list of around 10000 english words...]
filelist = [...list of around 5000 filenames...]
wordlistre = re.compile('|'.join(wordlist), re.IGNORECASE)
discovered = []
for x in filelist:
with open(x, 'r') as f:
found = wordlistre.findall(f.read())
if found:
discovered = [x, found]
它以大约每秒5个文件的速度检查文件,这比手动执行要快得多,但是仍然非常慢。有更好的方法吗?在
Aho-Corasick algorithm正是为这种用法而设计的,并在Unix中实现为
fgrep
。在POSIX中,定义了grep -F
命令来执行此功能。在它与正则
grep
的不同之处在于,它只使用固定字符串(而不是正则表达式),并针对搜索大量字符串进行了优化。在要在大量文件上运行它,请在命令行中指定精确的文件,或通过
xargs
传递这些文件:
^{pr2}$xargs
的功能是用尽可能多的文件填充命令行,并根据需要多次运行grep
每次调用的精确文件数取决于单个文件名的长度以及系统上
ARG_MAX
常量的大小。在如果没有关于数据的更多信息,有两种想法是使用词典而不是列表,并减少搜索/排序所需的数据。同时考虑使用重新分割如果您的分隔符不像下面这样干净:
{cd1>如果您可以访问以下命令行:
您需要创建一个包含所有单词的文件
wordlist.txt
(每行一个单词)。在任何文件中与任何单词匹配的任何行都将以以下格式打印到STDOUT:
^{pr2}$相关问题 更多 >
编程相关推荐