实时策略游戏的快速欧氏距离计算

时间:2018-12-23 23:07:05

标签: python python-3.x numpy cython

实现快速距离计算的最佳方法是什么?

我正在为《星际争霸2》编写一个机器人,其中每帧必须计算许多距离。

这是正在使用的库的一部分,我想改进: https://github.com/Dentosal/python-sc2/blob/develop/sc2/position.py

我记录了一个10分钟游戏的计算结果,平均每帧有这么多呼叫:

distance_to 10
distance_to_point2 965
_distance_squared 1775
closest 42

请注意,closest由一个for循环组成,我测试了n有多大,并获得了游戏的这种分布:

0 < n <= 5 : 21389
5 < n <= 10 :  16426
10 < n <=20 :  28202
20 < n <=605 : 13620
60 < n :  34
len n of 'closest' call: 79671
average n of 'closest' call: 13.815654378632125
min n of 'closest' call: 2
max n of 'closest' call: 128

我的想法是使用numpy,并且对于“最接近”功能,使用矢量解决方案来一次计算所有距离。

我还要实现另一个功能,该功能是计算一个列表的所有成员到另一列表的所有成员的最接近距离。

numpy是正确的主意吗?我要使用什么numpy功能? Cython会更好吗?

1 个答案:

答案 0 :(得分:2)

numpy和scipy在C语言中完成所有这些类型的计算。不需要自己做cython。

%%timeit
from scipy.spatial.distance import euclidean
import numpy as np
matrices = []
for i in range(10):
    matrices.append(np.random.randint(10,size=(1,5)))
[[euclidean(matrices[i],matrix) for i, j in enumerate(matrices)] for matrix in matrices]