【问题标题】:Fastest way to count instances of substrings in string Python3.6计算字符串Python3.6中子字符串实例的最快方法
【发布时间】:2019-06-17 13:15:40
【问题描述】:

我一直在研究一个程序,该程序需要计算主字符串(约 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

【问题讨论】:

  • 你试过 string.count() 吗?它返回子字符串的(非重叠)出现次数。

标签: python string performance bioinformatics biopython


【解决方案1】:

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

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

免责声明:这个方法是我写的,见commit 97709cc

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

【讨论】:

  • 太好了,感谢您的建议!我还没有研究过 Biopython,但这正是我想要的。
  • 其实,一旦你使用了BioPython之类的扩展,性能还可以——你可以做的是纯Python中的算法内核。
  • @jsbueno 我编写了 Biopython 实现,它是纯 Python,体面和有用我希望-我的观点是这与说 C 相比很慢-我知道,但是方法开发人员正在做严重的大规模 k像这样的 -mer 分析通常不会为此选择 Python(但这当然取决于它们的确切用例)
  • @Chris_Rands 你的代码肯定很有用 - 当使用 6-mers 时,它让我超过 100kb/s(与之前大约 100kb/min 相比),这对于我的目的来说已经足够快了,因为我m 不适用于真核序列。
【解决方案2】:

当然,Python 完全能够执行这些字符串搜索。但是,与其重新发明你需要的所有轮子,一次一个螺丝钉,你最好在 Python 中使用更专业的工具来处理你的问题 - 看起来 BioPython 项目是最积极维护和最完整的处理这类问题。

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

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

(如果问题只是重叠字符串,那么第 3 方“正则表达式”模块将是一种可行的方法 - https://pypi.org/project/regex/ - 因为 Python 的 re 模块中的内置正则表达式引擎无法处理重叠顺序)

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2023-04-06
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多