代码之家  ›  专栏  ›  技术社区  ›  mousomer

python中稀疏矩阵的并行计算

  •  0
  • mousomer  · 技术社区  · 7 年前

    我有一个大的[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 回复  |  直到 7 年前
        1
  •  1
  •   Roland Smith    7 年前

    这件衣服很适合你 multiprocessing.Pool .

    创建numpy数组,然后尽可能创建一个2元组迭代器 i 和 j 价值观例如 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内核数量相同的工作线程。

        2
  •  0
  •   mousomer    7 年前

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

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

    它已经得到了优化。在jupyter实验室用Macbook pro运行2000 vectors需要1.3秒。