你有两件事在这里工作。第一个是 Go 被编译成机器代码并直接在 CPU 上运行,而 Python 被编译成字节码,在(特别慢的)VM 上运行。
第二个也是更重要的影响性能的因素是这两个程序的语义实际上是显着不同的。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 根,使用变量名来引用place,而 Python 使用变量名来引用things。由于整数在 python 中被认为是唯一的、不可变的实体,我们必须不断地创建新的实体。Python 应该比 Go 慢,但您选择了最坏的情况 -在 Benchmarks Game 中,我们看到 Go 平均快 25 倍(最坏情况下为 100 倍)。
你可能已经读过,如果你的 Python 程序太慢,你可以通过将东西移到 C 中来加速它们。幸运的是,在这种情况下,有人已经为你做了这件事。如果你重写你的空循环来使用xrange()像这样:
for x in xrange(1000000000):
pass
print "Done."
...您会看到它的运行速度大约是原来的两倍。如果您发现循环计数器实际上是程序中的主要瓶颈,那么可能是时候研究一种解决问题的新方法了。