python中循环的并行化
我有一组简单的代码,可以从Python运行Clustal Omega(一种蛋白质多序列比对程序):python中循环的并行化,python,loops,parallel-processing,biopython,Python,Loops,Parallel Processing,Biopython,我有一组简单的代码,可以从Python运行Clustal Omega(一种蛋白质多序列比对程序): from Bio.Align.Applications import ClustalOmegaCommandline segments = range(1, 9) segments.reverse() for segment in segments: in_file = '1.0 - Split FASTA Files/Segment %d.fasta' % segment o
from Bio.Align.Applications import ClustalOmegaCommandline
segments = range(1, 9)
segments.reverse()
for segment in segments:
in_file = '1.0 - Split FASTA Files/Segment %d.fasta' % segment
out_file = '1.1 - Aligned FASTA Files/Segment %d Aligned.fasta' % segment
distmat = '1.1 - Distmats/Segment %d Distmat.fasta' % segment
cline = ClustalOmegaCommandline(infile=in_file,
outfile=out_file,
distmat_out=distmat,
distmat_full=True,
verbose=True,
force=True)
print cline
cline()
我已经做了一些非正式的测试来确定我的多重序列比对(MSA)需要多长时间。平均来说,每一个都需要4个小时。一个接一个地运行所有8个,总共花了我32个小时。因此,这就是我将它作为for
循环运行的初衷——我可以让它运行而不必担心它
然而,我做了另一个非正式的测试——我从打印的cline中获取输出,复制并粘贴到分布在两台计算机上的8个单独的终端窗口中,并以这种方式运行msa。平均来说,每一个都需要8个小时左右。。。但因为它们同时运行,我只花了8个小时就得到了结果
在某些方面,我发现了并行处理!:D
但我现在面临着如何在Python中运行它的困境。我已经试着看了下面的文章,但是我仍然不能理解多处理模块是如何工作的
员额清单:
有人愿意分享一下他们将如何并行化这个循环吗?我确实看到了许多类似于这个循环的循环,在这个循环中,我对一个文件执行一些操作并写入另一个文件,而不需要在内存中聚合结果。我面临的具体区别是需要执行文件I/O,而不是聚合循环并行运行的结果。对于段中的段,写入
def f(段)
,然后使用multiprocessing.Pool().map(f,段)
如何将其置于上下文中留给读者作为练习。对于段中的段,编写
def(段)
,然后使用multiprocessing.Pool().map(f,段)
如何将其置于上下文中,留给读者作为练习。可能就是您要寻找的
让我举一个使用它的例子:
import time
from joblib import Parallel, delayed
def long_function():
time.sleep(1)
REPETITIONS = 4
Parallel(n_jobs=REPETITIONS)(
delayed(long_function)() for _ in range(REPETITIONS))
此代码在1秒内运行,而不是4秒
调整代码如下所示(抱歉,我无法测试这是否正确):
可能这就是你要找的
让我举一个使用它的例子:
import time
from joblib import Parallel, delayed
def long_function():
time.sleep(1)
REPETITIONS = 4
Parallel(n_jobs=REPETITIONS)(
delayed(long_function)() for _ in range(REPETITIONS))
此代码在1秒内运行,而不是4秒
调整代码如下所示(抱歉,我无法测试这是否正确):
由于其他文章已经阐述了实现
for
循环并行化的多种方法,有什么具体问题困扰您吗?没有一个示例涉及文件I/O,而是涉及聚合并行运行的结果。至少,当我阅读这些帖子时,我是这么想的。请原谅我的无知,我仍然认为自己是许多计算概念和Python的新手。如果文件I/O是你关心的问题,请在这个问题上明确指出。就目前的情况而言,它与您链接的问题完全相同。不过,顺便说一句,文件I/O并没有什么特别之处。您只需在进程之间使用一些锁,以避免对文件进行无意义的输出,您就完成了。@Bakuriu,我从一开始就在帖子中这样做了。请阅读下面的一段。@ericmjl不,您的问题的唯一目的不清楚是如何处理并行I/O。在编写时,它看起来像是对代码中不相关细节的随意评论。如果你的问题是“我如何处理文件的并行输出?”那么就写吧,不要只写“我如何并行化这个循环?”然后,在一个随机的地方写上“代码碰巧包含文件I/O”。因为其他文章已经陈述了实现for
循环并行化的多种方法,有什么具体的问题困扰着你吗?没有一个例子涉及文件I/O,而是涉及聚合并行运行的结果。至少,当我阅读这些帖子时,我是这么想的。请原谅我的无知,我仍然认为自己是许多计算概念和Python的新手。如果文件I/O是你关心的问题,请在这个问题上明确指出。就目前的情况而言,它与您链接的问题完全相同。不过,顺便说一句,文件I/O并没有什么特别之处。您只需在进程之间使用一些锁,以避免对文件进行无意义的输出,您就完成了。@Bakuriu,我从一开始就在帖子中这样做了。请阅读下面的一段。@ericmjl不,您的问题的唯一目的不清楚是如何处理并行I/O。在编写时,它看起来像是对代码中不相关细节的随意评论。如果你的问题是“我如何处理文件的并行输出?”那么就写它,不要只写“我如何并行化这个循环?”然后在一个随机的地方写“代码碰巧包含文件I/O”。我认为在这里使用imap
而不是map
可能是合适的,因为运行时间太长。我认为在这里使用imap
而不是map
可能是合适的,因为运行时间太长。谢谢你的帮助!我可以问一下,假设这是从IPython笔记本上运行的,我会把下的部分放在一个单元格中,然后运行该单元格吗?是的,如果代码的其余部分包含在已计算的前一个单元格中,然后你可以按照你所描述的那样运行它。这在我的python版本中不起作用。它说没有这样的模块。@robbieboy74:你安装了Joblib库了吗?这不是一个标准的模块谢谢你的帮助!我可以问一下,假设这是从IPython笔记本上运行的,我是否会将下的部分放在一个单元格中,然后运行该单元格?是的,如果代码的其余部分包含在已计算的前一个单元格中,那么您可以按您所描述的方式运行它。这不是