Optimierte Methode zur Berechnung des Kosinusabstands in Python

Ich habe eine Methode geschrieben, um den Kosinusabstand zwischen zwei Arrays zu berechnen:

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

Das Ausführen kann auf einem großen Array sehr langsam sein. Gibt es eine optimierte Version dieser Methode, die schneller laufen würde?

Update: Ich habe alle bisherigen Vorschläge ausprobiert, auch scipy. Hier ist die zu schlagende Version mit Vorschlägen von Mike und 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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage