我有一個問題,我不得不做下面的計算。 我想避免循環版本,所以我矢量化了它。 爲什麼循環版本比矢量化版本更快? 有沒有人對此有過解釋。爲什麼矢量化版本變慢?
THX
import numpy as np
from numpy.core.umath_tests import inner1d
num_vertices = 40000
num_pca_dims = 1000
num_vert_coords = 3
a = np.arange(num_vert_coords * num_vertices * num_pca_dims).reshape((num_pca_dims, num_vertices*num_vert_coords)).T
#n-by-3
norms = np.arange(num_vertices * num_vert_coords).reshape(num_vertices,-1)
#Loop version
def slowversion(a,norms):
res_list = []
for c_idx in range(a.shape[1]):
curr_col = a[:,c_idx].reshape(-1,3)
res = inner1d(curr_col, norms)
res_list.append(res)
res_list_conc = np.column_stack(res_list)
return res_list_conc
#Fast version
def fastversion(a,norms):
a_3 = a.reshape(num_vertices, 3, num_pca_dims)
fast_res = np.sum(a_3 * norms[:,:,None], axis=1)
return fast_res
res_list_conc = slowversion(a,norms)
fast_res = fastversion(a,norms)
assert np.all(res_list_conc == fast_res)
你可以顯示時間嗎? – user2357112
見http://stackoverflow.com/q/14566564/399704看起來有關 –
4000萬雙精度元素= 320 MB。難道你的「快速」版本正在製作整個東西的副本嗎?或者它以非最佳方式訪問元素(不利用緩存一致性)? – Floris