<p>我需要找到一个bytes对象s1的最大前缀(从开头开始的字节串),它是另一个bytes对象s2的子串,并返回以s2和length为单位的起始位置。在这种情况下,s2碰巧也与s1重叠。在</p>
<p>最佳结果是最长的前缀从最接近s2的结尾开始。在</p>
<p>我试着用字节.rfind方法如下。在</p>
<p>注意:这是试图在src中查找前面在src中存在的、从索引<code>maxOffset</code>开始的最大前缀<code>maxOffset</code>,该前缀位于<code>index</code>之前的最大<code>maxOffset</code>字节内。因此,s1是<code>src[index:]</code>,s2是<code>src[index-maxOffset:index+maxLength-1]</code>。<code>maxLength</code>是我感兴趣的前缀的最大长度。在</p>
<pre><code>def crl(index, src, maxOffset, maxLength):
"""
Returns starting position in source before index from where the max runlength is detected.
"""
src_size = len(src)
if index > src_size:
return (-1, 0)
if (index+maxLength) > src_size:
maxLength = src_size - index
startPos = max(0, index-maxOffset)
endPos = index+maxLength-1
l = maxLength
while l>1:
if src[index:index+l] in src[startPos:index+l-1]:
p = src.rfind(src[index:index+l], startPos, index+l-1)
return (p,l)
l -= 1
return (-1, 0)
</code></pre>
<p>由于之前的实现非常缓慢,我也尝试了如下代码</p>
^{pr2}$
<p>虽然第二次实施更快,但仍然非常缓慢,我认为效率低下。我怎样才能提高效率和运行速度?在</p>