python、pypy、go语言的计算性能的比拼

《python vs. pypy vs. go语言的计算性能的比拼》是昨晚写的一个帖子,比拼加法运算的结果是:
pypy大概是python的80多倍;go大概是pypy5倍;go大概是python的400多倍。

但是那只是加法的比拼,开了一个问答,有兴趣的小伙伴可以补充更多的场景比较。

喜欢这个问题 | 分享 | 新建回答

回答

黄太龙

Jan 20, 2024
3 赞

抛砖引玉,再来一篇python、pypy、go在json解析上的性能比拼。

python的代码:

import time
import tornado.escape as es
json_str = '{"name": "Alice", "age": 30, "email": "alice@example.com"}'
t1 = time.time()
for i in range(1000000):
    res = es.json_decode( json_str )
t2 = time.time()
delta_t = t2 - t1
delta_t = delta_t * 1000
print(res['name'])
print(delta_t)

go的代码:

package main
import (
    "fmt"
    "time"
    "encoding/json"
)
func main() {
  type User struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Email   string `json:"email"`
  }
  jsonStr := `{"name": "Alice", "age": 30, "email": "alice@example.com"}`
  var user User
  t1 := time.Now().UnixNano() / 1e6
  for i:=0; i<1000000; i++ {
    err := json.Unmarshal([]byte(jsonStr), &user)
    if err != nil {
        fmt.Println(err)
    }
  }
  t2 := time.Now().UnixNano() / 1e6
  delta_t := t2 - t1
  fmt.Println( user.Name )
  fmt.Println( delta_t )
}

上述的go使用的是原生的“encoding/json”,但是实际上第三方的模块比原生的性能高,使用jsoniter的代码如下(要提前安装jsoniter,命令行运行“go get github.com/json-iterator/go”):

package main
import (
    "fmt"
    "time"
    "github.com/json-iterator/go"
)
func main() {
  type User struct {
        Name    string `json:"name"`
        Age     int    `json:"age"`
        Email   string `json:"email"`
  }
  jsonStr := `{"name": "Alice", "age": 30, "email": "alice@example.com"}`
  var user User
  t1 := time.Now().UnixNano() / 1e6
  for i:=0; i<1000000; i++ {
    err := jsoniter.Unmarshal([]byte(jsonStr), &user)
    if err != nil {
        fmt.Println(err)
    }
  }
  t2 := time.Now().UnixNano() / 1e6
  delta_t := t2 - t1
  fmt.Println( user.Name )
  fmt.Println( delta_t )
}

python分别使用了python2和python3,pypy也分别使用了python2的pypy和python3的pypy3,比较结果如下:

go语言原生的json模块:2401 ms
go语言第三方的jsoniter模块:539 ms
python2解释器:10456 ms
python3解释器:6586 ms
pypy解释器:435 ms
pypy3解释器:390 ms

可见pypy/pypy3和go语言第三方的jsoniter模块是一个级别上的,但是pypy和pypy3更快20%左右。
go语言第三方jsoniter大概是原生的json模块4.5倍;
go语言原生的json模块,大概比python3快4倍;但是pypy3模式比go语言原生的json模块5-6倍。

所以pypy模式下的python脚本,在一定场景下,即使是比拼计算能力,也未必一定弱于golang。