Python 了解scipy.spatial.distance.pdist的好处

Python 了解scipy.spatial.distance.pdist的好处,python,matrix,Python,Matrix,我需要计算矩阵每两行之间的余弦距离。 我每次只需要一行,所以我的天真实现是: for Id1 in range(m.shape[0]): distance = [scipy.spatial.distance.cosine(m[Id1,],m[Id2,]) for Id2 in range(m.shape[0])] 结果表明,对于407*53矩阵,naive实现大约需要4秒 虽然我不想要完整的矩阵,但我尝试了: pairwiseDistance = scipy.s

我需要计算矩阵每两行之间的余弦距离。 我每次只需要一行,所以我的天真实现是:

        for Id1 in range(m.shape[0]):
        distance = [scipy.spatial.distance.cosine(m[Id1,],m[Id2,]) for Id2 in range(m.shape[0])]
结果表明,对于407*53矩阵,naive实现大约需要4秒

虽然我不想要完整的矩阵,但我尝试了:

pairwiseDistance = scipy.spatial.distance.pdist(m,metric = 'cosine')
它只需要0.004秒(!)


我希望有一个小的线性改进(我只需要矩阵的一半,这个过程可以并行完成等等)。改进如此显著的原因是什么?

当您将字符串传递到
pdist
以使用其预定义的度量之一时,它使用的是用C编写的版本,比调用Python版本快得多。这一点在本文中提到


即使在Python函数中使用
pdist
也可能比使用列表理解快一些,因为
pdist
仍然可以在C中执行循环并分配结果数组。

在C中实现的代码比在Python中编写的代码运行速度快1000?@伙计们:在某些情况下,是的。