为了账号安全,请及时绑定邮箱和手机立即绑定

比 Python 慢?

比 Python 慢?

Go
qq_遁去的一_1 2021-09-10 21:15:06
我有以下 Go 代码:package mainimport ("fmt"        "os"        "bufio")func main() {    reader := bufio.NewReader(os.Stdin)    scanner := bufio.NewScanner(reader)    for scanner.Scan() {        fmt.Println(scanner.Text())    }}以及以下 Python 代码:import sysfor ln in sys.stdin:    print ln,两者都只是从标准输入读取行并打印到标准输出。Python 版本仅使用 Go 版本所需时间的 1/4(在 1600 万行文本文件上测试并输出到 /dev/null)。这是为什么?更新:按照 JimB 和 siritinga 的建议,我将 Go 的输出更改为缓冲版本。现在 Go 版本要快得多,但仍然比 Python 版本慢 75%。package mainimport ("os"        "bufio")func main() {    reader := bufio.NewReader(os.Stdin)    scanner := bufio.NewScanner(reader)    writer := bufio.NewWriter(os.Stdout)    for scanner.Scan() {        writer.WriteString(scanner.Text()+"\n")    }}
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

正如 JimB 所说,停止使用字符串。Python 2.x 字符串只是原始字节。Go 字符串是 UTF-8。这需要编码、检查错误等。另一方面,您还可以从字符串中获得更多功能。此外,构建字符串需要额外的内存分配。


如果使用 Python 实现更改为 unicode 字符串(升级到 3.x 或 unicode 字符串实现为 2.x),性能将会下降。如果你改成和 Go 版本类似的编码,你会得到更好的性能:


package main


import ("os"

        "bufio")


func main() {

    reader := bufio.NewReader(os.Stdin)

    scanner := bufio.NewScanner(reader)

    writer := bufio.NewWriter(os.Stdout)

    newline := []byte("\n")


    for scanner.Scan() {

        writer.Write(scanner.Bytes())

        writer.Write(newline)

    }

}

在我的系统上,使用 6500 万行的单词列表,Python:


real    0m12.724s

user    0m12.581s

sys     0m0.145s

和 Go 版本:


real    0m4.408s

user    0m4.276s

sys     0m0.135s

还应该注意的是,就性能比较而言,这不是一个好例子。它不代表真正的应用程序会做什么,以某种方式处理数据。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信