在这里有两个因素起作用。首先,Go语言被编译成机器码并直接在CPU上运行,而Python被编译为字节码并针对(特别慢的)虚拟机执行。
第二个更重要的影响程序性能的因素是,这两个程序的语义实际上有很大的不同。Go版本创建了一个名为“x”的“框”,该框包含一个数字,并在每次通过程序时将其增加1。Python版本实际上必须在每个循环中创建一个新的“框”(int对象),并最终不得不将它们丢弃。我们可以通过稍微修改您的程序来演示这一点:
package main
import (
"fmt"
)
func main() {
for i := 0; i < 10; i++ {
fmt.Printf("%d %p\n", i, &i)
}
}
...并且:
x = 0;
while x < 10:
x += 1
print x, id(x)
这是因为Go由于其C语言的根源,使用变量名来引用“位置”,而Python则使用变量名来引用“事物”。由于整数在Python中被视为唯一不可变的实体,我们必须不断创建新的整数。Python应该比Go慢,但你选择了最坏的情况-在
基准测试游戏中,我们发现Go平均快约25倍(最差的情况下快100倍)。
你可能已经读到过,如果你的Python程序运行太慢,可以通过将一些代码转换为C来提高速度。幸运的是,在这种情况下,有人已经为你完成了这项工作。如果你将空循环改写为使用
xrange(),就像这样:
for x in xrange(1000000000):
pass
print "Done."
如果你使用这种方法,你会发现它运行速度会快大约两倍。如果你发现循环计数器实际上是你程序的主要瓶颈,那么现在可能是时候去探索一种新的解决问题的方式了。