【问题标题】:how to speed up the pattern search btw two lists : python如何加快两个列表之间的模式搜索:python
【发布时间】:2013-06-18 17:34:49
【问题描述】:

我有两个 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 和 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)

请建议我应该如何处理上面的代码,以便它适用于更大的文件(40-1 亿条记录/文件,每条记录为 4 行)。

【问题讨论】:

    标签: python performance list large-files intersect


    【解决方案1】:

    使用列表推导,您可以编写:

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

    您也可以直接使用集合理解将它们定义为集合(取决于version of python you are using)

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

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

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

    【讨论】:

    • 在代码的第二部分,我在找到“@”的地方插入一个逗号,然后在这个逗号上拆分。这给了我一个列表,其中每个项目都是一组 4 行。接下来,我用 \t 分割 Records1[] 中的 eact 项,然后在 common[] 中搜索 records1[0]。如果找到匹配项,我会将该记录从 records1[] 写入一个新文件。不幸的是,完成的时间太长了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多