numpy矩阵的并行循环

时间:2018-07-15 17:39:29

标签: python-3.x parallel-processing python-multiprocessing joblib dtw

我正在看joblib示例,但是我不知道如何在矩阵上进行并行for循环。我正在计算矩阵行之间的成对距离度量。所以我在做:

N, _ = data.shape
upper_triangle = [(i, j) for i in range(N) for j in range(i + 1, N)]
dist_mat = np.zeros((N,N))  

for (i, j) in upper_triangle:
    dist_mat[i,j] = dist_fun(data[i], data[j])
    dist_mat[j,i] = dist_mat[i,j]

其中dist_fun取两个向量并计算距离。由于可以dist_fun彼此独立地进行调用,因此如何使该循环并行进行。


编辑:我正在使用的距离函数是fastdtw,它不是那么快。因此,我认为 确实 希望对此进行并行化。使用:

dist_mat = pdist(data, lambda x,y : fastdtw(x,y, dist=euclidean)[0])

执行时间为58.1084秒,并且使用:

dist_mat = np.zeros((N,N))
for (i,j), _ in np.ndenumerate(dist_mat):
    dist_mat[i,j], _ = fastdtw(data[i,:], timeseries[j,:], dist=euclidean)

我得到116.36秒并使用:

upper_triangle = [(i,j) for i in range(N) for j in range(i+1, N)]
dist_mat = np.zeros((N,N))

for (i,j) in upper_triangle:
    dist_mat[i,j], _ = fastdtw(data[i,:], data[j,:], dist=euclidean)
    dist_mat[j,i] = dist_mat[i,j]

我得到55.62秒。这里N=33scipy是否自动利用所有可用的内核?


编辑:我想我已经找到了使用multiprocessing包的方法,但是对于 joblib 在发布我认为有效的内容之前先做出回应。

1 个答案:

答案 0 :(得分:0)

这可以使用multiprocessing模块来完成,如下所示:

import numpy as np
from fastdtw import fastdtw
import multiprocessing as mp
from scipy.spatial.distance import squareform, euclidean
from functools import partial

# Create simulated data matrix
data = np.random.random((33,300))

N, _ = data.shape
upper_triangle = [(i,j) for i in range(N) for j in range(i+1, N)]

with mp.Pool(processes=4) as pool:
    result = pool.starmap(partial(fastdtw, dist=euclidean), [(data[i], data[j]) for (i,j) in upper_triangle])

dist_mat = squareform([item[0] for item in result])

timeit上使用IvyBridge Core-i5进行计时的结果:

24.052 secs

这是没有显式并行化的一半时间。

还:

作为使用fastdtw软件包的任何人的将来参考。如链接示例中所示,从scipy.spatial.distance导入距离函数并调用fastdtw比仅使用fastdtw(x,y,dist=2)要慢得多。结果似乎与我相似,并且使用pdist的执行时间(不求助于并行化)不到一秒钟。