Velocidade de cálculo de poderes (em python)

Estou curioso para saber por que é muito mais rápido multiplicar do que ter poderes em python (embora pelo que eu tenha lido, isso também pode ser verdade em muitos outros idiomas). Por exemplo, é muito mais rápido fazer

<code>x*x
</code>

do que

<code>x**2
</code>

Suponho que o operador ** seja mais geral e também possa lidar com poderes fracionários. Mas se é por isso que é muito mais lento, por que ele não executa uma verificação de um expoente int e apenas faz a multiplicação?

Editar: Aqui está um código de exemplo que eu tentei ...

<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>

Agora, o pow2 é apenas um exemplo rápido e claramente não está otimizado!
Mas mesmo assim eu acho que usando n = 2 er = 1.000.000, então pow1 leva ~ 2500ms e pow2 leva ~ 1700ms.
Eu admito que para valores grandes de n, então o pow1 fica muito mais rápido que o pow2. Mas isso não é muito surpreendente.

questionAnswers(6)

yourAnswerToTheQuestion