Быстрый расчет евклидова расстояния для стратегий в реальном времени - PullRequest
0 голосов
/ 24 декабря 2018

Каков наилучший способ осуществить быстрое вычисление расстояния?

Я кодирую бота для Starcraft 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 голосов
/ 24 декабря 2018

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]
...