Tienes dos cosas en el trabajo aquí. El primero de ellos es que Go se compila con código de máquina y se ejecuta directamente en la CPU, mientras que Python se compila para ejecutar bytecode en una máquina virtual (particularmente lenta).
El segundo, y más importante, lo que afecta el rendimiento es que la semántica de los dos programas son en realidad muy diferente. La versión Go hace una "caja" llamada "x" que contiene un número e incrementa eso en 1 en cada pase a través del programa. La versión de Python en realidad tiene que crear un nuevo "cuadro" (objeto int) en cada ciclo (y, eventualmente, tiene que tirarlos). Podemos demostrar esto modificando ligeramente sus programas:
package main
import (
"fmt"
)
func main() {
for i := 0; i < 10; i++ {
fmt.Printf("%d %p\n", i, &i)
}
}
... y:
x = 0;
while x < 10:
x += 1
print x, id(x)
Esto es debido a Go, debido a sus raíces C, toma un nombre de variable para hacer referencia a un lugar , donde Python toma nombres de variables para referirse a cosas. Como un entero se considera una entidad única e inmutable en Python, debemos crear constantemente nuevos. Python debe ser más lento que Go, pero ha escogido el peor de los casos: in the Benchmarks Game, vemos que va, en promedio, unas 25 veces más rápido (100 veces en el peor de los casos).
Probablemente hayas leído que, si tus programas Python son demasiado lentos, puedes acelerarlos moviendo cosas a C. Afortunadamente, en este caso, alguien ya lo hizo por ti. Si se vuelve a escribir su bucle vacío para usar xrange() así:
for x in xrange(1000000000):
pass
print "Done."
... verá correr el doble de rápido. Si encuentra que los contadores de bucles son realmente un cuello de botella importante en su programa, podría ser hora de investigar una nueva forma de resolver el problema.
Cambié el bucle for para asignar i a otra variable (es decir, i2 = i) para cada bucle y la velocidad seguía siendo la misma (así que básicamente sé que se ejecuta el bucle for). – bab
Tenía el programa de impresión i2 al final, e i2 era 999999999 – bab