Velocidad de los poderes de cálculo (en python)

Tengo curiosidad por saber por qué es mucho más rápido multiplicarse que tomar poderes en Python (aunque, por lo que he leído, esto también puede ser cierto en muchos otros idiomas). Por ejemplo, es mucho más rápido de hacer

<code>x*x
</code>

que

<code>x**2
</code>

Supongo que el operador ** es más general y también puede tratar con poderes fraccionarios. Pero si es por eso que es mucho más lento, ¿por qué no realiza una verificación de un exponente int y luego simplemente hace la multiplicación?

Editar: Aquí hay un código de ejemplo que probé ...

<code>def pow1(r, n):
  for i in range(r):
    p = i**n

def pow2(r, n):
  for i in range(r):
    p = 1
    for j in range(n):
      p *= i
</code>

Ahora, pow2 es solo un ejemplo rápido y claramente no está optimizado!
Pero aun así, encuentro que utilizando n = 2 y r = 1,000,000, pow1 toma ~ 2500ms y pow2 toma ~ 1700ms.
Admito que para valores grandes de n, entonces pow1 se vuelve mucho más rápido que pow2. Pero eso no es demasiado sorprendente.

Respuestas a la pregunta(6)

Su respuesta a la pregunta