¿Por qué la comprensión de listas es mucho más rápida que numpy para multiplicar matrices?

Recientemente respondí aESTA pregunta que quería la multiplicación de 2 listas, algún usuario sugirió la siguiente forma usando numpy, junto con la mía, que creo que es la forma correcta:

(a.T*b).T

También encontré quearay.resize() tiene el mismo rendimiento así. De cualquier manera, otra respuesta sugirió una solución usando la comprensión de la lista

[[m*n for n in second] for m, second in zip(b,a)]

Pero después del punto de referencia, vi que la comprensión de la lista funciona mucho más rápido que numpy:

from timeit import timeit

s1="""
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]

[[m*n for n in second] for m, second in zip(b,a)]
"""
s2="""
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([4,2,1])

(a.T*b).T
"""

print ' first: ' ,timeit(stmt=s1, number=1000000)
print 'second : ',timeit(stmt=s2, number=1000000,setup="import numpy as np")

resultado:

 first:  1.49778485298
second :  7.43547797203

Como puede ver numpy es aproximadamente 5 veces más rápido. pero lo más sorprendente fue que es más rápido sin usar transposición, y para el siguiente código:

a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])

a*b 

La comprensión de la lista todavía era 5 veces más rápida, por lo que, además de este punto, la comprensión de la lista se realiza en C aquí utilizamos 2 bucles anidados y unzip función Entonces, ¿cuál puede ser la razón? ¿Es por la operación?* en numpy?

También tenga en cuenta que no hay problema contimeit aquí puse elimport parte ensetup.

También lo probé con arras más grandes, la diferencia disminuye pero aún no tiene sentido:

s1="""
a=[[2,3,5],[3,6,2],[1,3,2]]*10000
b=[4,2,1]*10000

[[m*n for n in second] for m, second in zip(b,a)]
"""
s2="""
a=np.array([[2,3,5],[3,6,2],[1,3,2]]*10000)
b=np.array([4,2,1]*10000)

(a.T*b).T

"""



print ' first: ' ,timeit(stmt=s1, number=1000)
print 'second : ',timeit(stmt=s2, number=1000,setup="import numpy as np")

resultado:

 first:  10.7480301857
second :  13.1278889179

Respuestas a la pregunta(1)

Su respuesta a la pregunta