【发布时间】: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"):
如何组织我的数据以提高效率或有其他方法吗?
【问题讨论】:
-
以上。使用正则表达式搜索多个目标字符串作为正则表达式模式可能会提高搜索性能。此外,我会考虑使用
multiprocessing模块将工作分配到多个处理器上。您将使用一组工作人员处理文件的子集,然后在结果从每个子流程返回时对其进行整理。
标签: python-3.x string count substring