Diferencia en el rendimiento entre numpy y matlab.

Estoy calculando elbackpropagation Algoritmo para un autoencoder disperso. Lo he implementado en python usandonumpy y enmatlab. El código es casi el mismo, pero el rendimiento es muy diferente. El tiempo que toma matlab para completar la tarea es de 0.252454 segundos, mientras que el número 0.973672151566 es casi cuatro veces más. Llamaré a este código varias veces después en un problema de minimización, por lo que esta diferencia conlleva varios minutos de retraso entre las implementaciones. ¿Es este un comportamiento normal? ¿Cómo podría mejorar el rendimiento en numpy?

Implementación Numpy:

Sparse.rho es un parámetro de ajuste, sparse.nodes es el número de nodos en la capa oculta (25), sparse.input (64) el número de nodos en la capa de entrada, theta1 y theta2 son las matrices de peso para el primero y segunda capa, respectivamente, con dimensiones 25x64 y 64x25, m es igual a 10000, rhoest tiene una dimensión de (25,), x tiene una dimensión de 10000x64, a3 10000x64 y a2 10000x25.

UPDATE: He introducido cambios en el código siguiendo algunas de las ideas de las respuestas. El rendimiento ahora es numpy: 0.65 vs 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

Implementación de 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

Respuestas a la pregunta(3)

Su respuesta a la pregunta