Я думаю, что есть способ лучше / чище, но здесь он идет в моих силах.
def np_way():
# Compute 1st part: y[i]*y[j]*a[i]*a[j]
ay = a*y
ya = np.outer(ay, ay)
# print(ya)
# Compute 2nd part: np.dot(x[i].T, x[j])
_dot = np.outer(x, x)
dot = _dot[::2, ::2] + _dot[1::2, 1::2]
# print(dot)
return (ya * dot).sum()/2
Вы можете раскомментировать его для отладки.
Я поместил ваш код в функцию original_way()
и сравнил его с np_way()
, чтобы я мог timeit
:
%timeit original_way()
%timeit np_way()
1 loop, best of 3: 708 ms per loop
100 loops, best of 3: 3.21 ms per loop
Результаты были с длиной 500
, np_way()
примерно в 220 раз быстрее, чем original_way()
.