+ 1 за очень интересную задачу! Я не вижу никакого очевидного способа сделать это напрямую, но мне удалось добиться значительного ускорения (порядка 100 000 символьных строк) вместо использования следующей функции сравнения:
def compare_offsets2(a, b):
return (cmp(content[a:a+10], content[b:b+10]) or
cmp(content[a:], content[b:]))
Другими словами, начните со сравнения первых 10 символов каждого суффикса; только если результат этого сравнения равен 0, что свидетельствует о том, что у вас есть совпадение для первых 10 символов, вы продолжаете сравнивать все, что вам достаточно.
Очевидно, что 10 может быть чем угодно: экспериментируйте, чтобы найти лучшее значение.
Эта функция сравнения также является хорошим примером того, что нелегко заменить ключевой функцией.