使用 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'))
将记录转换为记录列表,这听起来可能无伤大雅,但如果您有数百万条记录,就会变得昂贵。根据 docs、SeqIO.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 的循环和类似的东西。
我正在研究 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'))
将记录转换为记录列表,这听起来可能无伤大雅,但如果您有数百万条记录,就会变得昂贵。根据 docs、SeqIO.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 的循环和类似的东西。