你说得对 - 你绝对不应该解析该文件twice,当您将数据转换为字典时,将数据存储在字典中会浪费计算资源numpy
稍后数组。
SeqIO.parse()
返回一个生成器,因此您可以逐条记录地迭代,构建一个列表,如下所示:
with open('sequences.fasta') as fasta_file: # Will close handle cleanly
identifiers = []
lengths = []
for seq_record in SeqIO.parse(fasta_file, 'fasta'): # (generator)
identifiers.append(seq_record.id)
lengths.append(len(seq_record.seq))
See 彼得·科克的回答以更有效的方式从 FASTA 文件中解析 ID 和序列。
你的其余代码对我来说看起来相当不错。但是,如果您确实想优化使用pandas
,您可以阅读以下内容:
关于最小化内存使用
咨询来源panda.Series,我们可以看到data
内部存储为numpy
ndarray
:
class Series(np.ndarray, Picklable, Groupable):
"""Generic indexed series (time series or otherwise) object.
Parameters
----------
data: array-like
Underlying values of Series, preferably as numpy ndarray
如果你做identifiers
an ndarray
,它可以直接用于Series
无需构造新数组(参数copy
, 默认False
)将阻止新的ndarray
如果不需要则创建。通过将序列存储在列表中,您将强制 Series 将所述列表强制转换为ndarray
.
避免初始化列表
如果您事先确切知道您有多少个序列(以及最长的 ID 有多长),您可以初始化一个空的ndarray
保存标识符,如下所示:
num_seqs = 50
max_id_len = 60
numpy.empty((num_seqs, 1), dtype='S{:d}'.format(max_id_len))
当然,很难确切地知道您将拥有多少个序列,或者最大的 ID 是多少,因此最简单的方法是让numpy
从现有列表转换。然而,这是技术上存储数据以供使用的最快方法pandas
.