【发布时间】:2015-04-16 19:41:22
【问题描述】:
我有一个很大的字典列表。我想从这个列表中计算一个二维矩阵,其中每个元素都是列表中第 i 个元素和列表中第 j 个元素的函数。代码是这样的:
matrix=np.array([])
biglist=self.some_method()
matrix.resize(len(biglist),len(biglist))
for i in range(len(biglist)):
for j in range(i,len(biglist)):
matrix[i,j]=self.__computeScore(biglist[i], biglist[j], i, j)[2]
matrix[j,i]=matrix[i,j]
现在__computeScore 方法非常简单:
def __computeScore(self, dictionary1, dictionary2, i, j):
#value=in future some computation over dictionary1 and dictionary2
value=1 #for now is so
return (i,j,value)
即使计算分数的方法很简单,现在计算矩阵也需要一段时间。我想并行化矩阵计算。最好的方法是什么?到目前为止,我已经尝试使用 multiprocessing 模块中的 apply_async 和 Pool.map,但是计算花费的时间比原始代码还要多。我试过类似的东西:
pool = multiprocessing.Pool(processes=4)
params=[]
print "argument creation" #this takes a while so it's not convinient
for i in range(len(biglist)):
for j in range(i,len(biglist)):
params.append((biglist[i],biglist[j],i,j))
result=pool.map(self.__computeScore, params) #takes more time than the original code
我也尝试过类似的方法:
def my_callback( result ):
matrix[result[0],result[1]]=result[2]
pool = multiprocessing.Pool(processes=4)
for i in range(len(biglist)):
rcopy=dict(biglist[i])
for j in range(i,len(biglist)):
ccopy=dict(biglist[j])
pool.apply_async(self.__computeScore, args=(rcopy, ccopy, i, j), callback = my_callback)
pool.close()
pool.join()
但它比原始代码花费更多时间。我哪里错了?谢谢你
【问题讨论】:
标签: python numpy matrix parallel-processing threadpool