Python 3.x numpy矩阵上循环的并行计算

Python 3.x numpy矩阵上循环的并行计算,python-3.x,parallel-processing,python-multiprocessing,joblib,dtw,Python 3.x,Parallel Processing,Python Multiprocessing,Joblib,Dtw,我正在看这些例子,但我不知道如何在矩阵上进行并行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])

我正在看这些例子,但我不知道如何在矩阵上进行并行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\u fun
取两个向量并计算距离。由于对
dist\u fun
的调用可以彼此独立,因此如何使此循环并行


编辑:我使用的距离函数是不是那么快。所以我认为真的想把它并行化。使用:

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)
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]
我得到116.36秒,并使用:

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)
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=33
scipy
是否自动使用所有可用的内核



编辑:我想我已经找到了一个使用该软件包的方法,但是在我发布我认为有效的方法之前,我会让joblib人员回答这个问题

这可以通过使用模块按如下方式完成:

在上使用的定时结果:

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

另外:


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

可用于此。典型的N?
数据通常为33 x 300。所以
N
应该是33。