Я пытаюсь изучить cython; однако, я должен делать что-то неправильно. Эта небольшая часть тестового кода работает примерно в 50 раз медленнее, чем моя векторизованная версия numpy. Может кто-нибудь, пожалуйста, скажите, почему мой cython медленнее моего питона? Благодарю.cython работает медленнее, чем numpy для вычисления расстояния
Код вычисляет расстояние между точкой в R^3, loc и множеством точек в R^3, точках.
import numpy as np
cimport numpy as np
import cython
cimport cython
DTYPE = np.float64
ctypedef np.float64_t DTYPE_t
@cython.boundscheck(False) # turn of bounds-checking for entire function
@cython.wraparound(False)
@cython.nonecheck(False)
def distMeasureCython(np.ndarray[DTYPE_t, ndim=2] points, np.ndarray[DTYPE_t, ndim=1] loc):
cdef unsigned int i
cdef unsigned int L = points.shape[0]
cdef np.ndarray[DTYPE_t, ndim=1] d = np.zeros(L)
for i in xrange(0,L):
d[i] = np.sqrt((points[i,0] - loc[0])**2 + (points[i,1] - loc[1])**2 + (points[i,2] - loc[2])**2)
return d
Это числовой код, с которым он сравнивается.
from numpy import *
N = 1e6
points = random.uniform(0,1,(N,3))
loc = random.uniform(0,1,(3))
def distMeasureNumpy(points,loc):
d = points - loc
d = sqrt(sum(d*d,axis=1))
return d
Версия numpy/python занимает около 44 мс, а версия cython занимает около 2 секунд. Я запускаю python 2.7 на Mac OSX. Я использую команду% timeit ipython для запуска двух функций.
Я не вижу ничего явно неправильного с версией cython (и я удивлен, что это так медленно, как есть). Тем не менее, вы не будете бить правильное векторное выражение numpy с помощью cython. Cython лучше (и вообще неплохо) для операций, которые не могут быть векторизованы. Кроме того, вы можете немного ускорить свою версию numpy, используя 'd = np.hypot (* d.T)'. –
Запустили ли вы 'cython -a your_code.pyx' и просмотрели' your_code.html'? Это удобный способ проверить код C, созданный cython, и узнать, сколько было переведено на C и сколько еще работает на уровне Python. –