Вы можете использовать класс Counter из коллекции в сочетании с zip для получения подпоследовательностей:
from collections import Counter
def most_freq_seq(seq,count):
counts = Counter("".join(s) for s in zip(*(seq[i:] for i in range(count))))
return counts.most_common(1)[0]
output:
r,c = most_freq_seq("AAGTTAGTCA", 3)
print(r,c)
# 'AGT' 2
Я знаю, что последовательности ДНК очень длинные, но я верю в это даст результаты в разумные сроки.
Для последовательности из 10 миллионов записей я получаю результат примерно за 3 секунды, используя случайные данные:
import random
import time
sequence = "".join(random.choice("ACGT") for _ in range(10_000_000))
size = 7
start = time.time()
seq,count = most_freq_seq(sequence,size)
print(seq,count,time.time()-start)
# CCCAATT 704 3.12