在Python中加速列表处理

在Python中加速列表处理,python,list,numpy,scipy,Python,List,Numpy,Scipy,我有两个列表list1和list2,每个列表的大小都是5000,每个列表条目都是numpy.array。我想以快速有效的方式计算列表元素之间的欧几里德距离的平方,也就是说,我需要为I和j的每个组合计算和((list1[I]-list2[j])**2),因此总共是2500000个组合。目前,我通过运行一个双循环并通过 result[i,j] = sum((list1[i]-list2[j])**2) 但在我的电脑上仍然需要大约4分钟的时间。我在想,是否可以用一些技巧来进一步加快计算速度 如果您

我有两个列表
list1
list2
,每个列表的大小都是5000,每个列表条目都是
numpy.array
。我想以快速有效的方式计算列表元素之间的欧几里德距离的平方,也就是说,我需要为I和j的每个组合计算
和((list1[I]-list2[j])**2)
,因此总共是2500000个组合。目前,我通过运行一个双循环并通过

result[i,j] = sum((list1[i]-list2[j])**2) 
但在我的电脑上仍然需要大约4分钟的时间。我在想,是否可以用一些技巧来进一步加快计算速度

如果您坚持numpy(假设您的内部阵列为1-D):

请注意,根据您对距离的定义,这是欧几里得距离的平方。如果需要距离本身,只需取其平方根即可。
否则,我更喜欢@Quang的评论:

from scipy.spatial import distance_matrix
dist_mat = distance_matrix(list1, list2)

i与j的距离与j与i的距离相同。通过使用从外部索引开始的内部循环,可以缩短一半的时间为什么有数组列表?使用2D数组和类似的东西时,速度会快得多。
来自scipy.spatial import distance_matrix;距离矩阵=距离矩阵(列表1,列表2)
?组件阵列的形状是否都相同?所有1d?如果每个列表中的所有数组都是相同的形状,那么一个简单的广播应该可以做到这一点。非常感谢,这些都是来自每个人的非常好的响应!特别是scipy函数,可以将距离矩阵的计算速度提高很多倍。@Steve欢迎您。很高兴这有帮助。请查看如何接受答案,并欢迎访问SO。
from scipy.spatial import distance_matrix
dist_mat = distance_matrix(list1, list2)