python - 比 Python 慢?

标签 python performance go

我有以下 Go 代码:

package main

import ("fmt"
        "os"
        "bufio")

func main() {
    reader := bufio.NewReader(os.Stdin)
    scanner := bufio.NewScanner(reader)

    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}

和以下 Python 代码:

import sys

for ln in sys.stdin:
    print ln,

两者都只是从标准输入读取行并打印到标准输出。 Python 版本仅使用 Go 版本所需时间的 1/4(在 1600 万行文本文件上测试并输出到/dev/null)。这是为什么?

更新:根据 JimB 和 siritinga 的建议,我将 Go 的输出更改为缓冲版本。现在 Go 版本要快得多,但仍然比 Python 版本慢 75%。

package main

import ("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")
    }
}

最佳答案

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

如果您使用 Python 实现更改为 unicode 字符串(升级到 3.x 或 2.x 的 unicode 字符串实现),性能将会下降。如果你改成和 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

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

关于python - 比 Python 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27967765/

相关文章:

python - 在 Julia 中将整数数组转换为字符数组,反之亦然

mysql - 哪个 INSERT/UPDATE/SELECT 比例推荐使用索引?

arrays - println 在 go 中显示为空字符串

JavaScript 性能预热

go - Gorilla 工具包的无限重定向循环

go - 从Go中的函数获取第n个返回值

Python argparse - 将父解析器参数分组

python - 如何在一个文件中写入多个管理命令? Django

python - 如何对返回 JSON 对象的方法进行单元测试?

python - 排序元素(排列)的数量,在列表的所有可能排列中