当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么我的python打印比Go的fmt.Print和os.Stdout.Write运行得更快》经验,为你挑选了1个好方法。

我正在尝试研究有关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 out执行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

--- Edit2 ---对于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

dave.. 6

Python3缓冲的输出print

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

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

您需要执行以下操作:

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

测试是等效的



1> dave..:

Python3缓冲的输出print

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

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

您需要执行以下操作:

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

测试是等效的

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有