go和python读写文件的效率对比

对比项目

单线程顺序执行程序,在本地磁盘对文件进行读和写。

写文件

执行步骤:

  1. 向本地磁盘写1千万行文本。
  2. 记录写完的时间。

python脚本

import os
import time
file=open("temp-py.txt",'w')

sTime=time.time()
for i in range(int(round(1e8))):#
    file.write("helllo worldhelllo worldhelllo worldhelllo worldhelllo worldhelllo worldhelllo worldhelllo world\n")

file.close()

print("cost time:%d/s"%(time.time()-sTime))

go程序

package main

import (
    "bufio"
    "flag"
    "log"
    "os"
    "time"
)

func main() {
    var filePath string

    flag.StringVar(&filePath, "f", "", "-f=path/to/your/filePath")
    flag.Parse()

    if filePath == "" {
        filePath = os.Getenv("HOME") + "/temp-go.txt"
    }

    file, _ := os.Create(filePath)
    defer file.Close()

    wt := bufio.NewWriter(file)

    //写入1百万行数据,11s
    sTime := time.Now().UnixNano() / 1e6
    for i := 0; i < 1e8; i++ {
        _, err := wt.WriteString("helllo worldhelllo worldhelllo worldhelllo worldhelllo worldhelllo worldhelllo worldhelllo world\n")
        if err != nil {
            log.Println(err)
        }
    }

    wt.Flush()
    eTime := time.Now().UnixNano() / 1e6
    log.Printf("cost time:%d/ms", (eTime - sTime))
}

最后会在磁盘生成一个9.7GB的文本文件。
耗时:

  • python:48s
  • go: 27s

读文件

执行步骤:

  1. 读取前面写入的9.7GB的文本文件。
  2. 记录遍历完每一行所需要的时间。

Python脚本

import os
import time
file=open("temp-go.txt",'r')

sTime=time.time()
while file.readline():#
    pass

file.close()

print("cost time:%d/s"%(time.time()-sTime))

go程序

package main

import (
    "bufio"
    "log"
    "os"
    "time"
)

func main() {
    filePath := os.Getenv("HOME") + "/temp-go.txt"
    file, _ := os.Open(filePath)

    sTime := time.Now().Unix()
    myscan := bufio.NewScanner(file)
    for myscan.Scan() {
    }
    eTime := time.Now().Unix()
    log.Fatalf("cost time:%d/s", (eTime - sTime))

}

执行时间:

  • python:42s
  • go:27s

总结

在最简单的文件IO层面,go语言已经在性能上对python展现出了压倒性的优势,更不用说go的更厉害的goroutine高并发的特性了。


image.png

但是python的优势就是语法简洁,代码量少。

所以:如果要看程序执行效率,还是用go。如果是和人比效率,追求自动化,建议用python。

你可能感兴趣的:(go和python读写文件的效率对比)