在您给出的简单示例中,使用for k in xrange(4):时,循环体只执行两次(如果r==s),或者执行三次(如果r!=s),并且下面的一个初始numpy实现慢了一个很大的因素。Numpy被优化为在长向量上执行计算,如果向量很短,开销可能会超过好处。(注意,在这个公式中,矩阵被分为不同的维度,并且不连续地索引,这只会使向量化实现的事情变得更复杂)。在import numpy as np
distance_matrix_np = np.array(distance_matrix)
stream_matrix_np = np.array(stream_matrix)
n = 4
def deltaC_np(r, s, sol):
delta = 0
sol_r, sol_s = sol[r], sol[s]
K = np.array([i for i in xrange(n) if i!=r and i!=s])
return np.sum(
(stream_matrix_np[r,K] - stream_matrix_np[s,K]) \
* (distance_matrix_np[sol_s,sol[K]] - distance_matrix_np[sol_r,sol[K]]) + \
(stream_matrix_np[K,r] - stream_matrix_np[K,s]) \
* (distance_matrix_np[sol[K],sol_s] - distance_matrix_np[sol[K],sol_r]))
在这个numpy实现中,操作应用于numpy中for中的元素,而不是for循环,而是应用于numpy中K中的所有元素。另外,请注意,您的数学表达式可以简化。左边括号里的每一项都是右边括号里的否定项。