【发布时间】:2017-12-15 19:56:31
【问题描述】:
我正在尝试编写一个 Python 函数,以使用并行计算快速计算列表的总和。最初我尝试使用 Python 多线程库,但后来我注意到所有线程都运行在同一个 CPU 上,所以没有速度增益,所以我切换到使用多处理。在第一个版本中,我将列表设为全局变量:
from multiprocessing import Pool
array = 100000000*[1]
def sumPart(fromTo:tuple):
return sum(array[fromTo[0]:fromTo[1]])
with Pool(2) as pool:
print(sum(pool.map(sumPart, [(0,len(array)//2), (len(array)//2,len(array))])))
这很有效,并且在大约一半的串行计算时间后返回了正确的总和。
但后来我想让它成为一个接受数组作为参数的函数:
def parallelSum(theArray):
def sumPartLocal(fromTo: tuple):
return sum(theArray[fromTo[0]:fromTo[1]])
with Pool(2) as pool:
return (sum(pool.map(sumPartLocal, [(0, len(theArray) // 2), (len(theArray) // 2, len(theArray))])))
这里出现错误:
AttributeError: Can't pickle local object 'parallelSum.<locals>.sumPartLocal'
这个函数的正确写法是什么?
【问题讨论】:
标签: python-3.x multiprocessing