Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加快模式搜索btw两个列表:python_Python_Performance_List_Large Files_Intersect - Fatal编程技术网

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

如何加快模式搜索btw两个列表:python,python,performance,list,large-files,intersect,Python,Performance,List,Large Files,Intersect,我有两个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:80

我有两个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
我试过这个: 首先,我得到文件1和文件2中常见的读取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)
在这里,我在主文件中搜索commom 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)

请建议我如何处理上述代码,以便它可以处理更大的文件(4000-1亿条记录/文件,每条记录有4行)。

使用列表理解,您可以编写:

list1 = [i for item in data1 if '@' in item]
list2 = [i for item in data2 if '@' in item]
您还可以直接使用集合理解(取决于属性)将它们定义为集合

我希望从一开始就创建集合要比创建一个列表然后进行设置更快


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

在代码的第二部分,我在找到“@”的地方插入一个逗号,然后在这个逗号上拆分。这给了我一个列表,其中每个项都是一组4行。接下来,我用一个\t拆分Records1[]中的eact项,然后搜索Records1[0]共有[]。如果找到匹配项,我将从records1[]将该记录写入一个新文件。很遗憾,完成此操作所需时间太长。
set1 = {i for item in data1 if '@' in item}
set2 = {i for item in data2 if '@' in item}