gpt4 book ai didi

python - 为什么我的 python 打印比 Go 的 fmt.Print 和 os.Stdout.Write 运行得更快

转载 作者:行者123 更新时间:2023-11-28 20:54:48 24 4
gpt4 key购买 nike

我正在尝试研究有关 Go 效率的一些细节,因为我是新手。我想要执行的测试之一是查看 Go 的 fmt.Print 是否比 os.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

我知道这不是测试此过程的最佳方式。但这是我选择的那个,它很有趣。我仍然很想知道这些差异,但结果有点对我来说很有意义。 但是,为了好玩,我用 Python 3 做了同样的事情,而且速度更快

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 ---对于戴夫的回答,我继续设置 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

Whether output is buffered is usually determined by file, but if the flush keyword argument is true, the stream is forcibly flushed.

你需要做的:

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

等价的测试

关于python - 为什么我的 python 打印比 Go 的 fmt.Print 和 os.Stdout.Write 运行得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58941840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com