Tengo curiosidad de por qué es mucho más rápido multiplicar que tomar poderes en python (aunque por lo que he leído esto bien puede ser cierto en muchos otros idiomas también). Por ejemplo, es mucho más rápido que hacerVelocidad de cálculo de poderes (en python)
x*x
que
x**2
supongo que el operador ** es más general y también puede hacer frente a potencias fraccionarias. Pero si es por eso que es mucho más lento, ¿por qué no realiza una comprobación de un exponente int y luego simplemente realiza la multiplicación?
Editar: Aquí hay un código de ejemplo he intentado ...
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
Ahora, pow2 es sólo un ejemplo rápido y claramente no está optimizado!
Pero aun así me parece que usando n = 2 yr = 1,000,000, entonces 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.
¿Qué pasa si cambia de bucle para ir por 1/1000s en lugar de por 1s? – Nosredna
Sí, en ese caso ** es más rápido que mi loop loco! Ok, supongo que tendré que lidiar con el hecho de que para exponentes pequeños es más rápido multiplicar y no usar **. – Christwo
He escrito sobre esto (http://numericalrecipes.wordpress.com/2009/06/05/binary-exponentiation/), pero una búsqueda de exponenciación por cuadratura (http://en.wikipedia.org/wiki/ Exponentiation_by_squaring) también puede darte una mejor idea de cómo los poderes con exponentes enteros se calculan de manera eficiente, y por qué pueden ser marginalmente más lentos para los exponentes pequeños (<4). – Jaime