在python中稀疏矩阵的并行计算

时间:2019-01-01 14:01:09

标签: python parallel-processing sparse-matrix

我有一个大的[numpy]向量X和一个比较函数f(x,y)。我需要找到X f(X[I],X[j])<T的所有元素对,它们的某个阈值T。这很好:

good_inds = {}
for i in range(0,len(X)):
   for j in range(x+1,len(X)):
       score = f(X[i],X[j])
       if score<T:
           good_inds[x,y] = score

这实际上建立了一个字典,它代表稀疏矩阵。问题是它相当慢,我希望并行化此过程。 请告知。

2 个答案:

答案 0 :(得分:1)

这很适合multiprocessing.Pool

创建您的numpy数组,然后对所有可能的ij值进行2元组迭代。例如使用itertools.combinations

In [1]: import itertools

In [7]: list(itertools.combinations(range(4), 2))                                                        
Out[7]: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]

(当然,您应该将向量的长度用作range的参数。)

编写以下功能:

def worker(pair):
    i, j = pair
    rv = False
    if f(X[i],X[j]) < T:
       rv = True
    return (i, j, rv)

创建一个Pool,然后运行imap_unordered

p = multiprocessing.Pool()
for i, j, result in p.imap_unordered(worker, itertools.combinations(range(len(X)), 2)):
    if result:
        print('Good pair:', i, j)
        # do something with the results...

这将运行与CPU具有内核一样多的工作器。

答案 1 :(得分:0)

所以。显然SciPy已经足够好了。

full_dist_mat = spatial.distance.squareform( spatial.distance.pdist(vects2, metric='cosine'))

已被优化。在Macbook Pro上的jupyter实验室中,运行2000个向量需要1.3秒。