Python の JSONライブラリのパフォーマンステスト
概要
最近、あるお客さんから、快速なので、cjsonを使おうという要望をいただきましたが、以前、僕はcjsonは色なエッジケースの処理が微妙と分かっていて、実際に他のライブラリより早いのかなと思いました。cjsonのPyPIページいろなコメントが書かれています。しかも、最新パージョンは2007リリースでかなり古い。バグがあるのに、直っていないし、あんまりメンテしてないライブラリに見える。
simplejsonもjsonlib もCで拡張があり、かなり最適化されていると思ったので、テストしてみようと思いました。
というわけで、パフォーマンステストを作って、Bitbucketにアップしました
https://bitbucket.org/IanLewis/jsonlib-test
準備
buildoutを使って、環境を作ります
python bootstrap.py --distribute
./bin/bootstrap
テストを実行
./bin/run_testを実行します。オプションはいくつかあります。
-c,--concurrency: プロセス数。 これは、少なくとも、プロダクション環境になるべく近いようにするには、コアの台数にするのがおすすめです。デフォールトは 1プロセス-l,--loops: テストのループ回数。最終的に、ループ毎の秒間のオペレーション数の平均を取ります。デフォールトは 10回-i,--iterations: 1つのループのオペレーション回数。 デフォールトは 100回-f,--file: テストJSONファイル。デフォールトはリポジトリ内のschema.json
テスト結果
ローカルの MacBook Pro に動かしました。
$ ./bin/run_test -c 2 -i 500
Running 10 loops with 500 iterations with 2 processes
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3]
encode
========================================
simplejson: 3175.44574 /s
jsonlib2: 2925.55263 /s
cjson: 2901.22826 /s
jsonlib: 2860.49601 /s
json: 1489.21863 /s
demjson: 250.03410 /s
decode
========================================
simplejson: 3224.92945 /s
jsonlib2: 2980.32737 /s
cjson: 2940.61543 /s
jsonlib: 2847.47568 /s
json: 673.22381 /s
demjson: 145.67908 /s
まとめ
cjsonはやはり早いのですが、現代のsimplejsonとjsonlib2はcjsonより早くなっています。あんまり差が出ないけど、メンテされていないし、パーフォマンスのため、わざわざcjsonを選ぶメリットは特にないと思います。
Pythonの世界で、Cを名前に付けているライブラリが早いとイメージですが、他のライブラリより必ずしも早いというわけではない。
ちなみに、Python 2.6+に入っているjsonライブラリはsimplejsonではありますが、古いバージョンになっているし、必ずC拡張がコンパイルされているわけではないので、simplejsonの最新版を使うのがおすすめです。