Python 2.7 使用多处理并行化python中的嵌套循环
我有一个嵌套循环,在它下面,给定一个长度为Python 2.7 使用多处理并行化python中的嵌套循环,python-2.7,parallel-processing,Python 2.7,Parallel Processing,我有一个嵌套循环,在它下面,给定一个长度为n的长字符串S和一个长度为m的查询Q,检查Q是否是S的子串,并且max\u error有多少不匹配。由于外循环的每个迭代都是独立的,所以将其并行化以提高速度是有意义的(对吗?) 例如,如果S=ATGGTC,和Q=TCCT,以及max_err=2,那么Q是匹配的,因为S中的子字符串TGGT已经修改了您的想法。也就是说,pool.map()必须用更复杂的方法代替,因为您的函数需要更多的参数,而不仅仅是一个iterable参数。此外,使用函数依赖于返回值,这也
n
的长字符串S
和一个长度为m
的查询Q
,检查Q
是否是S
的子串,并且max\u error
有多少不匹配。由于外循环的每个迭代都是独立的,所以将其并行化以提高速度是有意义的(对吗?)
例如,如果
S=ATGGTC
,和Q=TCCT
,以及max_err=2
,那么Q
是匹配的,因为S
中的子字符串TGGT
已经修改了您的想法。也就是说,pool.map()
必须用更复杂的方法代替,因为您的函数需要更多的参数,而不仅仅是一个iterable参数。此外,使用函数依赖于返回值,这也需要在多处理中进行特殊处理
以下解决方案使用单独调用的过程
对象实例和一个共享变量,该变量指示给定条件是否匹配:
from multiprocessing import Process, Value
def inner_loop(flag,S,Q,m,i,max_err):
cnt = 0
if flag.value == -1:
for k in range(m):
if S[i+k]!=Q[k]:
cnt += 1
if cnt>max_err:
break
if cnt<=max_err:
flag.value = 1
def is_match_parallel(S,n,Q,m,max_err):
flag = Value('i', -1)
processes = []
for i in range(0,n-m):
p = Process(target=inner_loop, args=(flag,S,Q,m,i,max_err,))
processes.append(p)
p.start()
for p in processes: p.join()
return flag
分别返回1和-1 马克斯·厄尔是什么?您能否提供输入和预期输出?为什么不使用更多的pythonic方法?@atru我添加了一个例子。谢谢!所以在这里我们要等到所有的过程都完成了,对吗?如果是,有没有办法在其中一个进程找到匹配项时立即停止其他进程?是的,我们正在等待:)我会考虑的,肯定有一个。这实际上是有道理的——我不确定它会在多大程度上像现在这样加快速度。可能是对于非常长的字符串-这是用于某些DNA处理还是字母是巧合?完成后,只有在尚未找到匹配项的情况下,处理才会进入内循环中的循环。在没有循环的情况下快速完成函数不应该真的很耗时。让我知道这是如何工作的。我用一个大一点的字符串来测试它,以调用更多的进程,它工作得很好,但我没有计时。
def inner_loop(S,Q,m,i):
cnt = 0
for k in range(m):
if S[i+k]!=Q[k]: cnt += 1
if cnt>max_err: break
if cnt<=max_err: return i
return -1
def is_match_parallel(S,n,Q,m,max_err):
inner_loop_1_par = inner_loop(S=S, Q=Q, m=m, i)
result = []
pool = multiprocessing.Pool()
## the following line is not probably right
result = pool.map(inner_loop_1_par, range(n-m))
for i in range(n-m):
if result[i]!=-1: return i
return -1
from multiprocessing import Process, Value
def inner_loop(flag,S,Q,m,i,max_err):
cnt = 0
if flag.value == -1:
for k in range(m):
if S[i+k]!=Q[k]:
cnt += 1
if cnt>max_err:
break
if cnt<=max_err:
flag.value = 1
def is_match_parallel(S,n,Q,m,max_err):
flag = Value('i', -1)
processes = []
for i in range(0,n-m):
p = Process(target=inner_loop, args=(flag,S,Q,m,i,max_err,))
processes.append(p)
p.start()
for p in processes: p.join()
return flag
s = 'ATGGTC'
q = 'TCCT'
res = is_match_parallel(s, len(s), q, len(q), 2)
print res.value
res = is_match_parallel(s, len(s), q, len(q), 1)
print res.value