Я написал метод расчета расстояния косинуса между двумя массивами:Оптимизирован метод вычисления косинуса расстояния в Python
def cosine_distance(a, b):
if len(a) != len(b):
return False
numerator = 0
denoma = 0
denomb = 0
for i in range(len(a)):
numerator += a[i]*b[i]
denoma += abs(a[i])**2
denomb += abs(b[i])**2
result = 1 - numerator/(sqrt(denoma)*sqrt(denomb))
return result
Запуск может быть очень медленным на большом массиве. Существует ли оптимизированная версия этого метода, которая будет работать быстрее?
Обновление: Я пробовал все предложения на сегодняшний день, в том числе scipy. Вот версия бить, включая предложения от Mike и Steve:
def cosine_distance(a, b):
if len(a) != len(b):
raise ValueError, "a and b must be same length" #Steve
numerator = 0
denoma = 0
denomb = 0
for i in range(len(a)): #Mike's optimizations:
ai = a[i] #only calculate once
bi = b[i]
numerator += ai*bi #faster than exponent (barely)
denoma += ai*ai #strip abs() since it's squaring
denomb += bi*bi
result = 1 - numerator/(sqrt(denoma)*sqrt(denomb))
return result
Есть a и b массивы комплексных чисел? –
Я пробовал все предложения до сих пор, и в настоящее время предложения Майка Данлэйви об оптимизации существующего кода дали наилучшие результаты. Думаю, я оставлю вопрос открытым, если есть другие стратегии решения этой проблемы, но большинство предложений закончилось тем, что на самом деле он работает медленнее исходного кода, поэтому Python должен оптимизировать работу на лету. И @gnibbler, я не использую никаких сложных чисел. – Dan
Я не понимаю, почему вы принимаете абс перед тем, как вы это сделаете. –