Método optimizado para calcular la distancia de coseno en Python

Escribí un método para calcular la distancia de coseno entre dos matrices:

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

Ejecutarlo puede ser muy lento en una gran variedad. ¿Existe una versión optimizada de este método que se ejecutaría más rápido?

Actualización: He intentado todas las sugerencias hasta la fecha, incluyendo scipy. Aquí está la versión a batir, incorporando sugerencias de Mike y 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

Respuestas a la pregunta(8)

Su respuesta a la pregunta