Я работаю над проектом, который невероятно чувствителен к времени (к сожалению, должен быть в python), и одна из функций, которая широко используется, - это функция, которая вычисляет центр тяжести списка (x, y) кортежи. Чтобы проиллюстрировать:
def centroid(*points):
x_coords = [p[0] for p in points]
y_coords = [p[1] for p in points]
_len = len(points)
centroid_x = sum(x_coords)/_len
centroid_y = sum(y_coords)/_len
return [centroid_x, centroid_y]
где
>>> centroid((0, 0), (10, 0), (10, 10), (0, 10))
[5, 5]
Эта функция работает довольно быстро, приведенный выше пример завершается в среднем 1,49e-05 секунд в моей системе, но я ищу самый быстрый способ вычисления центроида. У вас есть идеи?
Одним из других решений, которые я имел, было сделать следующее (где l
- список кортежей):
map(len(l).__rtruediv__, map(sum, zip(*l)))
который работает между 1,01e-05 и 9,6e-06 секунд, но, к сожалению, преобразование в список (путем окружения всего оператора в list( ... )
) почти удваивает время вычисления.
EDIT: предложения приветствуются в чистом питоне, но не numpy.
EDIT2: только что выяснилось, что если для длины списка кортежей сохранена отдельная переменная, то моя реализация выше с помощью map
работает надежно в течение 9,2e-06 секунд, но все еще существует проблема с обращением к список.
EDIT3:
Теперь я принимаю ответы только на чистом питоне, а не в numpy (извините за те, которые уже ответили в numpy!)