使用 biopython 的 SeqIO 模块查找独特的克隆

unique clones finding using SeqIO module of biopython

我正在研究 DNA 的下一代测序 (NGS) 分析。我正在使用 SeqIO Biopython 模块来解析 Fasta 格式的 DNA 文库。我只想过滤唯一的克隆(唯一的记录)。为此,我使用以下 python 代码。

seen=[]
unique_clones=[]
records=list(SeqIO.parse('DNA_library', 'fasta'))
for record in records:
  if str(record.seq) not in seen:
    seen.append(str(record.seq))
    unique_clones.append(record)
SeqIO.write(unique_clones, 'unique_clones.fasta', 'fasta')

一个DNA文库大概有100万条记录,我要分析的文库有100多个。 1 图书馆需要超过 2 小时才能通过此代码进行过滤。这段代码提取独特的克隆似乎很慢。还有其他方法可以过滤唯一记录吗??


针对 python 没有任何生物信息学工作经验的编码人员

fasta 格式的克隆有两个参数,ID (>id-number) 和 record(ATCG),如下所示:

>id-No-1
ATCGGGCTAAATTCGACTGCAGT

>id-No-2
ATCGGGCTAAATTCGACTGCAGT

我只想根据记录过滤唯一克隆并打印唯一克隆(id 和记录)。

如果我的问题或解释不够清楚,请告诉我。

我没有你的文件,所以我无法测试你将获得的实际性能提升,但这里有一些对我来说很慢的东西:

  • records=list(SeqIO.parse('DNA_library', 'fasta')) 将记录转换为记录列表,这听起来可能无伤大雅,但如果您有数百万条记录,就会变得昂贵。根据 docsSeqIO.parse(...) returns 一个迭代器,因此您可以直接迭代它。
  • 在跟踪查看的记录时使用 set 而不是 list。使用 in 执行成员资格检查时,列表必须遍历每个元素,而集合在恒定时间内执行操作(更多信息 here)。

进行这些更改后,您的代码将变为:

seen_records = set()
records_to_keep = []

for record in SeqIO.parse('DNA_library', 'fasta'):
  seq = str(record.seq)
  if seq not in seen_records:
    seen_records.add(seq)
    records_to_keep.append(record)

SeqIO.write(records_to_keep, 'unique_clones.fasta', 'fasta')

没有必要像上面提到的那样使用set,因为代码中的cpython机器检查这里if seq not in seen_records:的存在然后这里seen_records.add(seq)( sys.stdin)。所以我会试试这个:

from Bio.SeqRecord import SeqRecord

seen_seqs = list()
IDs = list()

for record in SeqIO.parse('DNA_library', 'fasta'):
    if record.seq not in seen_seqs:
        seen_seqs.append(record.seq)
        IDs.append(record.id)

SeqIO.write((SeqRecord(seq, id=ID, name="", description="") for seq, ID in zip(seen_seqs, IDs)),
            'unique_clones.fasta',
            'fasta')

如果这对您来说仍然太慢,请发表评论,因为我认为这是适用于 Cython 的。当您在 python 中处理大数据时,建议在其 C/C++ 包中处理它们,不要使用 python 的循环和类似的东西。