为什么我的 python 打印运行速度比 Go 的 fmt.打印和操作系统。Stdout.Write



我刚开始研究Go的效率细节。我想做的一个测试是看看Go的fmt.Printos.Stdout.WriteLine快还是慢

以下是结果。

fmt.打印速度

[kamori@kamori-pc playground]$ cat print.go 
package main
import "fmt"
import "os"
func main(){
os.Stderr.WriteString("Printing Hello World! 1000000000 times")
for i := 0; i < 1000000000; i++{
fmt.Print("Hello World!n")
}
}
[kamori@kamori-pc playground]$ go build print.go
[kamori@kamori-pc playground]$ time ./print >/dev/null
Printing Hello World! 1000000000 times
real    13m9.127s
user    8m52.461s
sys 4m15.433s

os.Stdout.WriteString

[kamori@kamori-pc playground]$ cat stdoutwrite.go 
package main
import "os"
func main(){
os.Stderr.WriteString("StdoutWriting Hello World! 1000000000 times")
for i := 0; i < 1000000000; i++{
os.Stdout.WriteString("Hello World!n")
}
}
[kamori@kamori-pc playground]$ go build stdoutwrite.go 
[kamori@kamori-pc playground]$ time ./stdoutwrite >/dev/null
StdoutWriting Hello World! 1000000000 times
real    11m36.198s
user    7m31.211s
sys    4m0.080s

我知道这不是测试这个过程的最佳方式。但这是我选择的,很有趣。我仍然很想知道其中的区别,但结果对我来说有点意义。然而,只是为了好玩,我对Python3做了同样的事情,它的速度更快

Python 3

[kamori@kamori-pc playground]$ cat print.py
for i in range(1000000000):
print("Hello World!")
[kamori@kamori-pc playground]$ time python3 print.py >/dev/null
real    6m46.542s
user    6m44.450s
sys    0m0.836s

以下是版本详细信息

[kamori@kamori-pc playground]$ go version
go version go1.13.4 linux/amd64
[kamori@kamori-pc playground]$ python --version
Python 3.7.4
[kamori@kamori-pc playground]$ uname -a
Linux kamori-pc 4.19.59-rt23-MANJARO #1 SMP PREEMPT RT Sat Jul 20 07:14:03 UTC 2019 x86_64 GNU/Linux

我的问题是,为什么python的Go性能超过了它我的期望是Go会更快,因为它是一种编译语言。当然,没有太多的逻辑需要快速计算,所以Python可能会走一些捷径。但是,这些工作负载看起来真的很小,除了启动开销之外,IMO这两种语言应该会很快恢复。

---编辑---

我看到了关于使用bufio缓冲我的写作的评论。还有神圣的钼。

[kamori@kamori-pc playground]$ cat bufferio.go 
package main
//import "fmt"
import "os"
import "bufio"
func main(){
os.Stderr.WriteString("Printing Hello World! 1000000000 times")
mywrite := bufio.NewWriter(os.Stdout)
for i := 0; i < 1000000000; i++{
mywrite.WriteString("Hello World!n")
}
}
[kamori@kamori-pc playground]$ go build bufferio.go 
[kamori@kamori-pc playground]$ time ./bufferio >/dev/null
Printing Hello World! 1000000000 times
real    0m9.882s
user    0m9.003s
sys 0m0.865s

---第2版---对于dave的答案,我继续设置flush=True,结果如下。这是我期望在最初的比较中看到的。看起来缓冲可以节省时间!

[kamori@kamori-pc playground]$ cat print_with_flush_true.py 
for i in range(1000000000):
print("Hello World!", flush=True)
[kamori@kamori-pc playground]$ time python3 print_with_flush_true.py >/dev/null 
real    27m38.319s
user    23m15.274s
sys 4m16.869s

Python3缓冲print的输出。

https://docs.python.org/3/library/functions.html#print

输出是否缓冲通常由文件决定,但如果flush关键字参数为true,则强制刷新流。

您需要执行以下操作:

print("Hello World!", flush=True)

测试为等效

相关内容

  • 没有找到相关文章