Разница в производительности между NumPy и Matlab

Я вычисляюbackpropagation алгоритм для разреженного автоэнкодера. Я реализовал это в Python, используяnumpy И вmatlab, Код почти такой же, но производительность сильно отличается. Время, затрачиваемое matlab на выполнение задачи, составляет 0,252454 секунды, а нулевое - 0,973672151566, что почти в четыре раза больше. Я назову этот код несколько раз позже, когда возникнет проблема минимизации, так что эта разница приводит к задержке в несколько минут между реализациями. Это нормальное поведение? Как я мог улучшить производительность в NumPy?

Numpy реализация:

Sparse.rho - параметр настройки, sparse.nodes - количество узлов в скрытом слое (25), sparse.input (64) - количество узлов во входном слое, theta1 и theta2 - матрицы весов для первого и второй слой соответственно с размерами 25x64 и 64x25, m равен 10000, rhoest имеет размерность (25,), x имеет размерность 10000x64, a3 10000x64 и a2 10000x25.

UPDATEЯ внес изменения в код, следуя некоторым идеям ответов. Производительность сейчас ничтожная: 0,65 против Matlab: 0,25.

partial_j1 = np.zeros(sparse.theta1.shape)
partial_j2 = np.zeros(sparse.theta2.shape)
partial_b1 = np.zeros(sparse.b1.shape)
partial_b2 = np.zeros(sparse.b2.shape)
t = time.time()

delta3t = (-(x-a3)*a3*(1-a3)).T

for i in range(m):

    delta3 = delta3t[:,i:(i+1)]
    sum1 =  np.dot(sparse.theta2.T,delta3)
    delta2 = ( sum1 + sum2 ) * a2[i:(i+1),:].T* (1 - a2[i:(i+1),:].T)
    partial_j1 += np.dot(delta2, a1[i:(i+1),:])
    partial_j2 += np.dot(delta3, a2[i:(i+1),:])
    partial_b1 += delta2
    partial_b2 += delta3

print "Backprop time:", time.time() -t

Реализация Matlab:

tic
for i = 1:m

    delta3 = -(data(i,:)-a3(i,:)).*a3(i,:).*(1 - a3(i,:));
    delta3 = delta3.';
    sum1 =  W2.'*delta3;
    sum2 = beta*(-sparsityParam./rhoest + (1 - sparsityParam) ./ (1.0 - rhoest) );
    delta2 = ( sum1 + sum2 ) .* a2(i,:).' .* (1 - a2(i,:).');
    W1grad = W1grad + delta2* a1(i,:);
    W2grad = W2grad + delta3* a2(i,:);
    b1grad = b1grad + delta2;
    b2grad = b2grad + delta3;
end
toc

Ответы на вопрос(3)

Ваш ответ на вопрос