《python vs. pypy vs. go语言的计算性能的比拼》是昨晚写的一个帖子,比拼加法运算的结果是:
pypy大概是python的80多倍;go大概是pypy5倍;go大概是python的400多倍。
但是那只是加法的比拼,开了一个问答,有兴趣的小伙伴可以补充更多的场景比较。
黄太龙
抛砖引玉,再来一篇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。