【问题标题】:Efficient way to check and count if a given subtring exists in a string in Python在 Python 中检查和计算给定子字符串是否存在于字符串中的有效方法
【发布时间】:2021-04-07 16:03:30
【问题描述】:

我有几个 fasta 文件(大约 40 个),其中有大量的序列(每个超过 100,000 个)。我想要做的是检查给定的字符串是否存在于不同的序列中,以及它是否计算在内。例如,

>序列_1 CAUAAAAUUAUAAUGCAUCGUUAUCAGCUGGGUCAUAUGUUAUGACAACGACUUGGCGGA AUACUAGUAAGUUGUCCUUUCCACUUAAUUGAAACGAUUUGCGCAGGAAUUUUGUGAUAA UUAUCAAAAAAA

>序列_2 CGCAGAUAGAUUCUGGCAGCCCUUGCCUGAUGUAAGCGUGUACGAUUGGAGAAGCCACCU CCCCAGAUCCGUGCUUCCCCGGACUUGUAGCCCAAAUCGAGUUAAUUACACACUAUUGUG UAUCCUAUGU

如果我想计算具有 AAAAAAA 的序列的数量,我应该得到 1,因为它只存在于两个序列之一中。

为了搜索字符串,我尝试了 Boyer-moore-horspool 和 Knuth-Morris-Pratt 算法。问题是我有一个需要检查的 20,000 个字符串的列表,因此这意味着对于每个字符串,它必须检查超过 400,000 个序列。在我的代码中,我使用 for 循环,而我拥有数据的方式使我使用了 3 个缩进的循环,我知道这太多了:

for w in words: 
    for x in list_files:
        with open(directory ,"r") as f:
           for seq_record in SeqIO.parse((directory), "fasta"):

如何组织我的数据以提高效率或有其他方法吗?

【问题讨论】:

  • 为什么不使用Seq 函数find() 甚至in 而不是编写自己的字符串搜索函数?我希望这些方法能在 biopython 中得到很好的实现。
  • 以上。使用正则表达式搜索多个目标字符串作为正则表达式模式可能会提高搜索性能。此外,我会考虑使用multiprocessing 模块将工作分配到多个处理器上。您将使用一组工作人员处理文件的子集,然后在结果从每个子流程返回时对其进行整理。

标签: python-3.x string count substring


【解决方案1】:

在相对较高的水平上,我会:

  1. 使用functools.partialconcurrent.futures 的组合使用ThreadpoolExecutor 来利用所有可用的CPU 内核
  2. 使用 cython / Boost.python / pybind11 编写 BMH 的实现并在 python 中导入(这将防止内部循环构造被写入 python)

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 2014-01-14
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    相关资源
    最近更新 更多