对于loof in for循环,是否要并行化?python

对于loof in for循环,是否要并行化?python,python,parallel-processing,multiprocessing,Python,Parallel Processing,Multiprocessing,我正在尝试将这个等式平行化: def cosfunction(a,b): sumxx, sumxy, sumyy = 0, 0, 0 for i in range(len(a)): x = a[i] y = b[i] sumxx += x*x sumyy += y*y sumxy += x*y return sumxy/math.sqrt(sumxx*sumyy)

我正在尝试将这个等式平行化:

def cosfunction(a,b):
     sumxx, sumxy, sumyy = 0, 0, 0
     for i in range(len(a)):
          x = a[i]
          y = b[i]
          sumxx += x*x
          sumyy += y*y
          sumxy += x*y
     return sumxy/math.sqrt(sumxx*sumyy)
     

def get_cosinesimilarity(vectrain, vectest):
     '''Calculates the cosine similarity for train and test'''
     x = vectrain 
     y = vectest 
     simlist = []
     for i in range(len(y)):
          sim = []
          listoftopten = [(0,0,0)] * 10
          for j in range(len(x)):
               cos = cosfunction(x[j],y[i])
               c = []
               for a in range(len(listoftopten)):
                    c.append(listoftopten[a][0])
               if cos > min(c):
                    listoftopten.remove(listoftopten[c.index(min(c))])
                    listoftopten.append((cos, x[j], y[i]))
          simlist.append(listoftopten)
     return simlist

我必须列出哪一个是vectrain(列车数据)和vectest(测试数据)。它们都包含如下格式的数据[[0.012545,0.58612,0.7892],[0.4566,0.4868,0.789]],因此基本上是向量。在我的get_余弦相似性函数中,我想计算每个测试向量与每个训练向量的余弦相似性。然后返回一个列表,每个测试向量包含10个元组(cos,i,j),其中cos表示余弦相似性,i表示列车集的向量,j表示测试集的向量。这就是我在ListofTopen中添加的内容。然后,每个testvector都有10个元组的列表被附加到simlist列表中,该列表将保存所有testvector的前10个元组的所有列表。非常重要的是,我的输出是我描述的simlist格式

然而,由于我的vectest和vectrain列表非常长(最多20万个向量),如果我不并行化它,那么这个过程需要很长时间才能完成。我以前从未在python中使用过多处理。有人能给我建议一下如何把这一点平行化吗


谢谢大家!

这里昂贵的操作似乎是计算余弦相似性之后的代码。您可能需要使用堆数据结构来获得前十名

本文试图通过并行化余弦相似性计算来提高性能(同时确保较低的空间复杂度)。参考:

def cosfunction(*args):
a=args[0]
b=args[1]
cos=0
# ... cos函数实现
返回cos,a,b
def insert_和_trim(堆、新_元素):
#请自己试试这个。
#遍历new_elements列表中的每个元素并插入到堆中
#修剪堆以确保堆不会膨胀
#执行上述操作的一种方法是创建“最大堆”。将新的_元素插入堆中。从堆中获取_max,直到堆包含10个元素。
通过
def获取前十名(堆):
#请自己试试这个。
#因为它是一个max堆,所以当您连续地从堆中获取max时,就会得到堆中元素的降序。
通过
def获取协同相似性(向量训练、向量测试):
''计算列车和试验的余弦相似性''
x=矢量火车
y=向量测试
simlist=[]
对于范围内的i(len(y)):
sim=[]
heap=None#自己创建一个堆;https://docs.python.org/3/library/heapq.html
ListOfTopen=[(0,0,0)]*10
批次大小=10#设置为您选择的任何值。被乌利米特封顶
args_list=[]
对于范围内的j(len(x)):
如果len(参数列表)<批次大小:
args_list.append((x[j],y[i]))
其他:
池=池(批量大小)
cos\u list=pool.map(cosfunction,args\u list)
插入_和_修剪(堆、cos_列表)
#对于14个元素,处理最后提前脱离循环的4个元素
如果len(参数列表)>0:
池=池(批量大小)
cos\u list=pool.map(cosfunction,args\u list)
插入_和_修剪(堆、cos_列表)
#插入_和_修剪(列表选项,cos_列表)
模拟追加(获取前十名(堆))
#模拟附加(获取前十名(ListofTopen))
返回sim卡
如果您不想使用heap,则可以使用原始实现,如下所示:

def insert_和_trim(列表选项,新的_元素):
#稍加修改的代码wrt问题,下面是余弦相似度计算
c=[]
对于新_元素中的cos、x、y:
对于范围内的(len(listoftopten)):
c、 追加(ListOfTopen[a][0])
如果cos>min(c):
listoftopten.remove(listoftopten[c.index(min(c))]))
追加((cos,x,y))
def获取前十名(列表选项):
返回列表选项