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

标签 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

最佳答案

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

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

免责声明:我写了这个方法,参见提交 97709cc .

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

关于python - 计算字符串 Python3.6 中子字符串实例的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54335869/

相关文章:

python - 通过最小化迭代次数来改进代码

c - strcmp 仅在循环开始时起作用

java - 如何使字符串从方法中获取返回值?

php - mySQL SELECT 和 COUNT 极速查询

python - 读取 os.popen() 输出不会返回任何内容

python - 我如何抵消 Pandas dayofyear 以便开始日期是 10 月 1 日而不是 1 月 1 日?

python - 列表对象转换为整数

java - 你如何在java中初始化一个字符串?

javascript - Angularjs 指令和现在 onclick 很慢

java - 在 Tomcat 6-Java 7/8 中运行 Tomcat 6-Java 6 WebApps