《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。