Оптимизация numpy.dot с помощью Cython

У меня есть следующий фрагмент кода, который я хотел бы оптимизировать с помощью Cython:

sim = numpy.dot(v1, v2) / (sqrt(numpy.dot(v1, v1)) * sqrt(numpy.dot(v2, v2))) 
dist = 1-sim
return dist

Я написал и скомпилировал файл .pyx, и когда я запускал код, я не увидеть какое-либо значительное улучшение производительности. Согласно документации Cython, я должен добавить c_types. HTML-файл, сгенерированный Cython, указывает, что узким местом являются скалярные произведения (что, конечно, ожидается). Означает ли это, что я должен определить функцию C для скалярных произведений? Если да, то как мне это сделать?

РЕДАКТИРОВАТЬ:

После некоторых исследований я придумал следующий код. Улучшение незначительное. Я не уверен, что могу что-то улучшить:

from __future__ import division
import numpy as np
import math as m
cimport numpy as np
cimport cython

cdef extern from "math.h":
    double c_sqrt "sqrt"(double)

ctypedef np.float reals #typedef_for easier readding

cdef inline double dot(np.ndarray[reals,ndim = 1] v1, np.ndarray[reals,ndim = 1] v2):
  cdef double result = 0
  cdef int i = 0
  cdef int length = v1.size
  cdef double el1 = 0
  cdef double el2 = 0
  for i in range(length):
    el1 = v1[i]
    el2 = v2[i]
    result += el1*el2
  return result

@cython.cdivision(True)
def distance(np.ndarray[reals,ndim = 1] ex1, np.ndarray[reals,ndim = 1] ex2):
  cdef double dot12 = dot(ex1, ex2)
  cdef double dot11 = dot(ex1, ex1)
  cdef double dot22 = dot(ex2, ex2)
  cdef double sim = dot12 / (c_sqrt(dot11 * dot22))
  cdef double dist = 1-sim    
  return dist 
9
задан George Eracleous 24 June 2012 в 15:35
поделиться