我用python编写了一段代码来读取DNA序列(稍后对它们进行motif对齐),但是,我正在寻找一种更有效的方法来实现这一点。在
如果您能提供帮助,请参阅以下内容:
handle = open("a.fas.txt", "r")
a = handle.readlines()[1:]
a = ''.join([x.strip() for x in a])
with open("Output.txt", "w") as text_file:
text_file.write(a)
f = 0
z = 100
b = ''
while f < len(a):
b += a[f:z]+'\n'
f += 1
z += 1
with open("2.txt", "w") as runner_mtfs:
runner_mtfs.write(b)
总之,我想对b的每一行做一系列分析,但我不知道有什么更有效的方法来做这件事,而不是把每100个碱基对分开。输出文件超过500兆字节。有什么建议吗?在
代码的第一部分只是一个DNA序列,我把所有的线连接在一起,我要分离出100个碱基对。在
我在这里看到的主要问题是你把所有的东西都写进了一个文件。这样做没有意义。您创建的大型输出文件是非常冗余的,并且在您进行分析时将其重新加载是没有帮助的。在
最初加载文件后,您感兴趣的每个窗口都是
a[x:x+100]
,有些是x
。实际上根本不需要显式地生成这些窗口:这样做不会有任何好处。遍历,并直接从a的每个窗口生成这些矩阵。在如果你真的需要整个东西,把它生成一个numpy数组。另外,如果我不使用任何简并的基代码,用0,1,2,3表示A,C,G,T,将序列转换成uint8s。这有助于加快速度,尤其是如果你需要在任何点上取补码,这可以通过简单地修改位来完成。在
Numpy可以使用
stride_tricks
非常有效地生成数组,如前所述in this blog post:或者,转换为整数:
^{pr2}$在我的机器上这个代码比你的快十倍。在
这是一个可以做一些你可能想要的事情的类。在
with open(...) file
)。它速度快,占用的内存更少。在似乎你想用固定大小的滑动窗口来处理数据。 我会这样做:
如果您真的想处理长度小于100(或者在我的示例中,小于
sliding window size
)的数据部分,您将不得不稍微修改该函数(在出现新的注释行和处理结束时)。在您也可以biopython。在
相关问题 更多 >
编程相关推荐