在Python中,我运行一个
reduce(func, bigArray[1:], bigArray[0])
我想添加并行处理来加快速度。
我知道可以通过拆分数组、在单独的部分上运行进程并合并结果来手动完成此操作。
然而,考虑到并行运行reduce的普遍性,我想看看是否有一种本地方式,或者一个库,可以自动完成这项工作。
我在运行一台6核的机器。
最佳答案
对于任何一个绊倒的人,我最后写了一个助手来做这件事
def parallelReduce(l, numCPUs, connection=None):
if numCPUs == 1 or len(l) <= 100:
returnVal= reduce(reduceFunc, l[1:], l[0])
if connection != None:
connection.send(returnVal)
return returnVal
parent1, child1 = multiprocessing.Pipe()
parent2, child2 = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=parallelReduce, args=(l[:len(l) // 2], numCPUs // 2, child1, ) )
p2 = multiprocessing.Process(target=parallelReduce, args=(l[len(l) // 2:], numCPUs // 2 + numCPUs%2, child2, ) )
p1.start()
p2.start()
leftReturn, rightReturn = parent1.recv(), parent2.recv()
p1.join()
p2.join()
returnVal = reduceFunc(leftReturn, rightReturn)
if connection != None:
connection.send(returnVal)
return returnVal
注意,您可以使用
multiprocessing.cpu_count()
获取CPU的数量与串行版本相比,使用此函数可以显著提高性能。