我有一个大的[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
这实际上建立了一个字典,它代表稀疏矩阵。问题是它相当慢,我希望并行化此过程。 请告知。
答案 0 :(得分:1)
这很适合multiprocessing.Pool
。
创建您的numpy数组,然后对所有可能的i
和j
值进行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秒。