你在工作中有兩件事情在這裏代替循環。第一個是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)
這是因爲圍棋,由於它的Ç根,以一個變量名來引用地方,其中Python採用變量名稱來指代事物。由於整數被認爲是python中唯一的,不可變的實體,我們必須不斷地創建新的實體。 Python應該比Go慢,但是你選擇了最壞的情況 - in the Benchmarks Game,我們看到的平均速度大約快25倍(在最壞的情況下是100倍)。
你可能讀到過,如果你的Python程序太慢了,你可以通過將東西移動到C來加速它。幸運的是,在這種情況下,有人已經爲你做了這個。如果你重寫你的空循環使用xrange()像這樣:
for x in xrange(1000000000):
pass
print "Done."
...你會看到它運行約快一倍。如果你發現循環計數器實際上是你的程序中的一個主要瓶頸,那麼可能是研究解決問題的新方法的時候了。
我改變了for循環,爲每個循環分配i給另一個變量(即i2 = i),速度仍然相同(所以基本上我知道for循環被執行)。 – bab
我在程序結束時打印了i2,i2是999999999 – bab