БОЛЬШОЕ РЕДАКТИРОВАНИЕ:
================
Для ясности я удаляю старые результаты и заменяю их более свежими. Вопрос все тот же: правильно ли я использую и Cython, и Numba, и какие улучшения в код можно внести? (У меня есть более новая и более простая временная записная книжка IPython со всем кодом и результатами здесь)
1)
Думаю, я понял, почему изначально не было разницы между Cython, Numba и CPython: это потому, что я их накормил
массивы numpy в качестве ввода:
x = np.asarray([x_i*np.random.randint(8,12)/10 for x_i in range(n)])
вместо списков:
x = [x_i*random.randint(8,12)/10 for x_i in range(n)]
Тестирование с использованием массивов Numpy в качестве входных данных
Тестирование с использованием списков Python в качестве входных данных
2)
Я заменил функцию zip()
явными циклами, однако особой разницы это не имело. Код будет таким:
CPython
def py_lstsqr(x, y):
""" Computes the least-squares solution to a linear matrix equation. """
len_x = len(x)
x_avg = sum(x)/len_x
y_avg = sum(y)/len(y)
var_x = 0
cov_xy = 0
for i in range(len_x):
temp = (x[i] - x_avg)
var_x += temp**2
cov_xy += temp*(y[i] - y_avg)
slope = cov_xy / var_x
y_interc = y_avg - slope*x_avg
return (slope, y_interc)
Cython
%load_ext cythonmagic
%%cython
def cy_lstsqr(x, y):
""" Computes the least-squares solution to a linear matrix equation. """
cdef double x_avg, y_avg, var_x, cov_xy,\
slope, y_interc, x_i, y_i
cdef int len_x
len_x = len(x)
x_avg = sum(x)/len_x
y_avg = sum(y)/len(y)
var_x = 0
cov_xy = 0
for i in range(len_x):
temp = (x[i] - x_avg)
var_x += temp**2
cov_xy += temp*(y[i] - y_avg)
slope = cov_xy / var_x
y_interc = y_avg - slope*x_avg
return (slope, y_interc)
Нумба
from numba import jit
@jit
def numba_lstsqr(x, y):
""" Computes the least-squares solution to a linear matrix equation. """
len_x = len(x)
x_avg = sum(x)/len_x
y_avg = sum(y)/len(y)
var_x = 0
cov_xy = 0
for i in range(len_x):
temp = (x[i] - x_avg)
var_x += temp**2
cov_xy += temp*(y[i] - y_avg)
slope = cov_xy / var_x
y_interc = y_avg - slope*x_avg
return (slope, y_interc)
np.linalg.lstsq
, а не выполнение обычных уравнений. - person YXD   schedule 08.05.2014py_mat_lstsqr
иnumba_mat_lstsqr
(что меня не удивляет). Но то, что я называю вашим вторым примером, - это сравнение междуnumba_lstsqr
иpy_lstsqr
(что меня удивляет). Погуглив, я вижу несколько случаев, когда кто-то сказал, что Numba не может вывести типы в некоторых функциях, поэтому не было ускорения, но я недостаточно знаю о Numba, чтобы знать, что здесь происходит, или как улучшить Это. - person BrenBarn   schedule 09.05.2014%pylab inline
вызов перезаписываетsum
встроенный, что нарушает ваши тайминги. Я тебе это сказал. Я написал эту кучу кода, чтобы доказать это вам. a > Так почему вы все еще говорите, что у меня есть ~ 30-кратные улучшения, когда я вообще не меняю код? ... - person Veedrac   schedule 09.05.2014