如何加快模式搜索BTW两个列表:python



我有两个fastq文件,如下所示。文件中的每条记录都以"@"开头。对于两个这样的文件,我的目标是提取两个文件中共同的记录。

@IRIS:7:1:17:394#0/1
GTCAGGACAAGAAAGACAANTCCAATTNACATTATG
+IRIS:7:1:17:394#0/1
aaabaa`]baaaaa_aab]D^^`b`aYDW]abaa`^
@IRIS:7:1:17:800#0/1
GGAAACACTACTTAGGCTTATAAGATCNGGTTGCGG
+IRIS:7:1:17:800#0/1
ababbaaabaaaaa`]`ba`]`aaaaYD\_a``XT

我试过了:首先,我得到一个在file1和fil2中常见的read id列表。

import sys
#('reading files and storing all lines in a list')
data1 = open(sys.argv[1]).read().splitlines()
data2 = open(sys.argv[2]).read().splitlines()
#('listing all read IDs from file1')
list1 = []
for item in data1:
  if '@' in item:
    list1.append(item)
#('listing all read IDs from file2')
list2 = []
for item in data2:
  if '@' in item:
    list2.append(item)
#('finding common reads in file1 and file2')
def intersect(a, b):
   return list(set(a) & set(b))
common = intersect(list1, list2)

在这里,我在主文件中搜索通用id,并在新文件中导出数据。下面的代码可以很好地处理小文件,但如果我尝试处理更大的文件,我的计算机就会冻结。我认为"for"占用了太多内存:

#('filtering read data from file1')
mod_data1 = open(sys.argv[1]).read().rstrip('n').replace('@', ',@')
tab1 = open(sys.argv[1] + '_final', 'wt')
records1 = mod_data1.split(',')
for item in records1[1:]:
  if item.replace('n', 't').split('t')[0] in common:
     tab1.write(item)

请建议我应该如何处理上面的代码,这样它就可以在更大的文件上工作(40-1亿个记录/文件,每个记录是4行)。

使用列表推导式,您可以这样写:

list1 = [i for item in data1 if '@' in item]
list2 = [i for item in data2 if '@' in item]

你也可以直接使用集合推导式(取决于你使用的python版本)将它们定义为集合。

set1 = {i for item in data1 if '@' in item}
set2 = {i for item in data2 if '@' in item}

我希望从一开始创建集合比创建一个列表然后从中创建一个集合要快。

至于代码的第二部分,我还不太确定您想要实现什么。

最新更新