Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使用多处理并行化python中的嵌套循环_Python 2.7_Parallel Processing - Fatal编程技术网

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