Python有效的方法来检查非常大的字符串是否包含子字符串

Jon*_*tin 9 python performance

Python不是我最好的语言,所以我不是那么擅长为我的一些问题找到最有效的解决方案.我有一个非常大的字符串(来自一个30 MB的文件),我需要检查该文件是否包含一个较小的子字符串(此字符串只有几十个字符).我目前的做法是:

if small_string in large_string:
    # logic here
Run Code Online (Sandbox Code Playgroud)

但这似乎效率很低,因为它会检查文件中每个可能的字符序列.我知道在换行符上只会有完全匹配,所以最好是以列表形式读取文件并遍历该列表以匹配?

编辑:为了澄清一些关于"仅在换行符上匹配"的混淆,这是一个例子:

small_string = "This is a line"
big_string = "This is a line\nThis is another line\nThis is yet another"
Run Code Online (Sandbox Code Playgroud)

如果我没有错,in关键字将检查所有序列,而不仅仅是每一行.

Mic*_*ski 14

这真的很慢吗?你说的是30MB字符串; 让我们尝试更大的字符串:

In [12]: string="agu82934u"*50*1024*1024+"string to be found"

In [13]: len(string)
Out[13]: 471859218

In [14]: %timeit "string to be found" in string
1 loops, best of 3: 335 ms per loop

In [15]: %timeit "string not to be found" in string
1 loops, best of 3: 200 ms per loop
Run Code Online (Sandbox Code Playgroud)

我不会说335毫秒是很多时间寻找450MB字符串中的子字符串.


Mar*_*tos 9

慢得多慢?我刚刚a in b在170 MB字符串的末尾对一个唯一的字符串进行了测试.它在我的手指离开Enter键之前完成.


Ped*_*iro 5

您可以使用以下算法之一:

\n\n\n\n

虽然我相信 KMP 更高效,但实现起来更复杂。第一个链接包含一些伪代码,应该很容易在 python 中实现。

\n\n

您可以在这里寻找替代方案:http ://en.wikipedia.org/wiki/String_searching_algorithm

\n

  • Python 已经使用了[“boyer-moore 和 horspool 之间的混合”的相当快的 C 级实现](https://hg.python.org/cpython/file/5444c2e22ff8/Objects/stringlib/fastsearch.h),所以在 Python 级别实现不同的字符串搜索算法可能会慢几个数量级。 (11认同)