计算字符串Python3.6中子字符串实例的最快方法

时间:2019-01-23 21:24:08

标签: python string performance bioinformatics biopython

我一直在研究一个程序,该程序需要计算主字符串(〜400,000个字符)内的子字符串(列表中最多包含4000个2-6个字符的子字符串)。我了解这类似于在Counting substrings in a string上提出的问题,但是,该解决方案不适用于我。由于我的子字符串是DNA序列,因此我的许多子字符串都是单个字符的重复实例(例如'AA');因此,如果我将字符串除以“ AA”,则“ AAA”将被解释为“ AA”的单个实例,而不是两个实例。我当前的解决方案是使用嵌套循环,但是我希望有一种更快的方法,因为对于单个主字符串,此代码需要5分钟以上的时间。预先感谢!

def getKmers(self, kmer):
    self.kmer_dict = {}
    kmer_tuples = list(product(['A', 'C', 'G', 'T'], repeat = kmer))
    kmer_list = []
    for x in range(len(kmer_tuples)):
        new_kmer = ''
        for y in range(kmer):
            new_kmer += kmer_tuples[x][y]
        kmer_list.append(new_kmer)
    for x in range(len(kmer_list)):
        self.kmer_dict[kmer_list[x]] = 0
    for x in range(len(self.sequence)-kmer):
        for substr in kmer_list:
            if self.sequence[x:x+kmer] == substr:
                self.kmer_dict[substr] += 1
                break
    return self.kmer_dict

2 个答案:

答案 0 :(得分:5)

要计算DNA的重叠子串,可以使用Biopython:

>>> from Bio.Seq import Seq
>>> Seq('AAA').count_overlap('AA')
2

免责声明:我编写了此方法,请参见提交97709cc

但是,如果您正在寻找真正的高性能,Python可能不是正确的语言选择(尽管像Cython这样的扩展程序可能会有所帮助)。

答案 1 :(得分:1)

当然,Python完全能够执行这些字符串搜索。但是,与其一次一次地拧一个螺丝,不如重新发明所有需要的轮子,最好是在Python内部使用一种更专业的工具来解决您的问题-看来BioPython项目是最活跃且维护最完整的项目解决这类问题。

带有类似您的问题的示例的简短文章: https://dodona.ugent.be/nl/exercises/1377336647/

链接至BioPython项目文档:https://biopython.org/wiki/Documentation

(如果问题只是字符串重叠,那么第3方“ regex”模块将是一种解决方法-https://pypi.org/project/regex/-就像Python的re模块中的内置正则表达式引擎可以的那样)也不能处理重叠序列)