title: Optimized method for calculating cosine distance in Python
body: <p>I wrote a method to calculate the cosine distance between two arrays:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Running it can be very slow on a large array. Is there an optimized version of this method that would run faster?</p>
  
  <p>Update: I've tried all the suggestions to date, including scipy. Here's the version to beat, incorporating suggestions from Mike and Steve:</p>
  
  <pre><code>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
  </code></pre>