GO-Node-Python的简单性能比较

栏目: Python · 发布时间: 6年前

内容简介:因为想了解大概的性能情况,所以有了这个比较,并不比较各个语言的优缺点。比较一下 Go,Node,Python 分别执行的时间比较。从

因为想了解大概的性能情况,所以有了这个比较,并不比较各个语言的优缺点。

比较一下 Go,Node,Python 分别执行的时间比较。

  1. 十亿次的循环运算(FOR)
  2. 遍历一百万个数字并将其写入一个文件(IO)
  3. 将含有十个元素的数组 排序 一千万次(SORT)

零、总结

性能 上讲,整体上 Go 性能是最高的。

代码简洁 上讲, Python 是最简洁的。

虽然结果这样,但我选择 Node

1. 运行代码

《Github源码地址》

git clone https://github.com/zhongxia245/performance-node-go-python

cd performance-node-go-python

sh for.sh

sh io.sh

sh sort.sh

2. 性能

大概跑了一下,性能最高的是Go。

分别执行了十亿次的循环运算(FOR),遍历一百万个数字并将其写入一个文件(IO),将含有十个元素的数组排序一千万次(SORT)。

GO, Node,Python, Pypy

GO-Node-Python的简单性能比较

去掉 Python 3 的时间

GO-Node-Python的简单性能比较

图由, https://antv.alipay.com/zh-cn/g2/3.x/demo/column/column12.html 这个生成。

一、运行环境

运行代码的环境配置如下:

name 配置
MacBook Pro (Retina, 13-inch, Early 2015)
Processor 2.7 GHz Intel Core i5
Memory 8 GB 1867 MHz DDR3
Graphics Intel Iris Graphics 6100 1536 MB
# 安装环境
brew install go 
brew install node 
brew install python
brew install pypy

语言版本

Python 3.5.2

NodeJs v10.13.0

go version go1.10.2 darwin/amd64

Python 2.7.13 (0e7ea4fe15e82d5124e805e2e4a37cae1a402d4b, Mar 22 2018, 12:32:13)

[PyPy 5.10.0 with GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]

二、比较类型

time命令

含义: time  执行命令并计时

命令行执行结束时在标准输出中打印执行该命令行的时间统计结果,其统计结果包含以下数据:
1. 实际时间(real time): command命令行开始执行到运行终止的消逝时间;
2. 用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;
3. 系统CPU时间(system CPU time): 命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和。

go run 会把编译时间算进去, 因此如果先 go build , 在执行,还会提升一些速度。

因为就算go run 速度已经是非常非常快了,因此就没有先构建,在执行了。

1. 循环/算术

迭代十亿项并把它们相加:

// nodejs
var r = 0
for (var c = 0; c < 1000000000; c++) {
  r += c
}
// go 
package main
func main() {
  var r int
  for c := 0; c < 1000000000; c++ {
        r += c
  }
}
# python
sum(range(1000000000))

Result

# sh for.sh
# exec => time node for/node.js && time go run for/go.go && time pypy for/python.py && time python3 for/python.py 
# node
╰─➤  sh for.sh                      
# node
real	0m1.109s
user	0m1.075s
sys	0m0.028s

# go 
real	0m0.489s
user	0m0.418s
sys	0m0.083s

# pypy
real	0m1.067s
user	0m1.025s
sys	0m0.036s

# python3
real	0m25.518s
user	0m25.299s
sys	0m0.108s
go > node == pypy >> python3

pypy可以大大提升python的性能,因此多加一个pypy的运行时间

PyPy 是 python 的一个解释器。

# mac 系统安装python
brew install pypy

2. I/O 操作

遍历一百万个数字并将其写入一个文件

// nodejs
var fs = require('fs')
var wstream = fs.createWriteStream('io/node')

for (var c = 0; c < 1000000; ++c) {
  wstream.write(c.toString())
}
wstream.end()
// go 
package main

import (
  "bufio"
  "os"
  "strconv"
)

func main() {
  file, _ := os.Create("io/go")
  b := bufio.NewWriter(file)
  for c := 0; c < 1000000; c++ {
    num := strconv.Itoa(c)
    b.WriteString(num)
  }
  file.Close()
}
# python
with open("io/python", "a") as text_file:
  for i in range(1000000):
      text_file.write(str(i))

Result

# node
real	0m1.513s
user	0m1.744s
sys	0m0.324s

# go
real	0m0.561s
user	0m0.240s
sys	0m0.250s

# pypy
real	0m0.329s
user	0m0.144s
sys	0m0.079s

# python3
real	0m0.633s
user	0m0.563s
sys	0m0.038s

有评论说:go加了buffer ,python和node都没加buffer,后面俩加了buffer,io那项至少再快一半

pypy > go > python3 >> node

3. 冒泡排序

将含有十个元素的数组排序一千万次。

// nodejs
function bubbleSort(input) {
  var n = input.length
  var swapped = true
  while (swapped) {
    swapped = false
    for (var i = 0; i < n; i++) {
      if (input[i - 1] > input[i]) {
        ;[input[i], input[i - 1]] = [input[i - 1], input[i]]
        swapped = true
      }
    }
  }
}
for (var c = 0; c < 1000000; c++) {
  const toBeSorted = [1, 3, 2, 4, 8, 6, 7, 2, 3, 0]
  bubbleSort(toBeSorted)
}
// go 
package main
var toBeSorted [10]int = [10]int{1, 3, 2, 4, 8, 6, 7, 2, 3, 0}
func bubbleSort(input [10]int) {
    n := len(input)
    swapped := true
    for swapped {
        swapped = false
        for i := 1; i < n; i++ {
            if input[i-1] > input[i] {
                input[i], input[i-1] = input[i-1], input[i]
                swapped = true
            }
        }
    }
}
func main() {
    for c := 0; c < 1000000; c++ {
        bubbleSort(toBeSorted)
    }
}
# python
def bubbleSort(input):
    length = len(input)
    swapped = True
    while swapped:
        swapped = False
        for i in range(1,length):
            if input[i - 1] > input[i]:
                input[i], input[i - 1] = input[i - 1], input[i]
                swapped = True
for i in range(1000000):
    toBeSorted = [1, 3, 2, 4, 8, 6, 7, 2, 3, 0]
    bubbleSort(toBeSorted)

Result

# sh sort.sh
# exec => time node sort/node.js && time go run sort/go.go && time pypy sort/python.py && time python3 sort/python.py 
# node
real	0m2.857s
user	0m2.816s
sys	0m0.033s

# go
real	0m0.303s
user	0m0.207s
sys	0m0.111s

# pypy
real	0m0.592s
user	0m0.554s
sys	0m0.032s

# python
real	0m17.504s
user	0m17.174s
sys	0m0.094s
go > pypy > node >> python

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CASIO fx-5800P编程计算器公路与铁路施工测量程序

CASIO fx-5800P编程计算器公路与铁路施工测量程序

2011-8 / 40.00元

《CASIO fx-5800P 编程计算器公路与铁路施工测量程序(第2版)》内容简介:第2版是一本全新的图书。书中的QH2-7T与QH2-8T程序都具有三维中边桩坐标正、反算,路基超高及边桩设计高程计算,边坡坡口与坡脚计算,桥墩桩基坐标计算,隧道超欠挖计算等功能。QH2-7T为交点法程序,QH2-8T为线元法程序,两个程序均使用数据库子程序输入平竖曲线的全部设计数据。测试程序各项功能所用的案例均取......一起来看看 《CASIO fx-5800P编程计算器公路与铁路施工测量程序》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具