¿Por qué numpy.power es 60 veces más lento que el revestimiento?

Tal vez estoy haciendo algo extraño, pero tal vez encontré una sorprendente pérdida de rendimiento cuando uso numpy, parece constante, independientemente de la potencia utilizada. Por ejemplo, cuando x es una matriz aleatoria de 100x100

x = numpy.power(x,3) 

es aproximadamente 60 veces más lento que

x = x*x*x

Una gráfica de la aceleración para varios tamaños de matriz revela un punto óptimo con matrices alrededor del tamaño 10k y una velocidad constante de 5-10x para otros tamaños.

Código para probar a continuación en su propia máquina (un poco desordenado):

import numpy as np
from matplotlib import pyplot as plt
from time import time

ratios = []
sizes = []
for n in np.logspace(1,3,20).astype(int):
    a = np.random.randn(n,n)

    inline_times = []
    for i in range(100):
        t = time()
        b = a*a*a
        inline_times.append(time()-t)
    inline_time = np.mean(inline_times)

    pow_times = []
    for i in range(100):
        t = time()
        b = np.power(a,3)
        pow_times.append(time()-t)
    pow_time = np.mean(pow_times)

    sizes.append(a.size)
    ratios.append(pow_time/inline_time)

plt.plot(sizes,ratios)
plt.title('Performance of inline vs numpy.power')
plt.ylabel('Nx speed-up using inline')
plt.xlabel('Array size')
plt.xscale('log')
plt.show()

Alguien tiene una explicación?

Respuestas a la pregunta(3)

Su respuesta a la pregunta