Método otimizado para calcular a distância do coseno em Python

Eu escrevi um método para calcular a distância de cosseno entre duas matrizes:

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

Executá-lo pode ser muito lento em uma grande matriz. Existe uma versão otimizada desse método que seria executada mais rapidamente?

Atualização: tentei todas as sugestões até o momento, incluindo scipy. Aqui está a versão para bater, incorporando sugestões de Mike e 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

questionAnswers(8)

yourAnswerToTheQuestion