我正在考虑使用 Go 编写一个主要处理文本的小程序。我很确定,根据我对 Go 和 Python 的了解,Go 会更快。我实际上并没有特别需要疯狂的速度,但我想了解 Go。
“Go 会更快”的想法得到了一个简单的测试的支持:
# test.py
print("Hello world")
$ time python dummy.py
Hello world
real 0m0.029s
user 0m0.019s
sys 0m0.010s
// test.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
$ time ./test
hello world
real 0m0.001s
user 0m0.001s
sys 0m0.000s
在原始启动速度方面看起来不错(这完全在意料之中)。高度非科学的理由:
$ strace python test.py 2>&1 | wc -l
1223
$ strace ./test 2>&1 | wc -l
174
然而,我的下一个人为测试是 Go 处理字符串时的速度有多快,我期待着同样被 Go 的原始速度所震撼。所以,这令人惊讶:
# test2.py
s = ""
for i in range(1000000):
s += "a"
$ time python test2.py
real 0m0.179s
user 0m0.145s
sys 0m0.013s
// test2.go
package main
func main() {
s := ""
for i:= 0; i < 1000000; i++ {
s += "a";
}
}
$ time ./test2
real 0m56.840s
user 1m50.836s
sys 0m17.653
所以 Go比 Python 慢数百倍。
现在,我知道这可能是由于Schlemiel the Painter 的算法,这解释了为什么 Go 实现是二次的i(i10 倍大导致 100 倍减速)。
然而,Python 的实现似乎要快得多:10 倍以上的循环只会使其速度减慢两倍。如果你 concatenate str(i),同样的效果仍然存在,所以我怀疑是否存在某种神奇的 JIT 优化s = 100000 * 'a'。如果我print(s)最后,它不会慢很多,所以变量没有被优化出来。
除了连接方法的幼稚(每种语言中肯定有更多的惯用方法),这里有什么我误解了,还是在 Go 中比在 Python 中更容易遇到必须处理 C/C++ 的情况处理字符串时的风格算法问题(在这种情况下,直接的 Go 端口可能不像我希望的那样好用,你知道,想想事情并做功课)?
或者我是否遇到过 Python 恰好运行良好但在更复杂的使用下崩溃的情况?
使用的版本: Python 3.8.2、Go 1.14.2
开心每一天1111
慕容3067478
相关分类