Python 3.x numpy矩阵上循环的并行计算
我正在看这些例子,但我不知道如何在矩阵上进行并行for循环。我在计算矩阵行之间的成对距离度量。所以我在做: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])
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。