最开始我们的 web 项目的时候,因为 json-py 最易使用——只有一个独立的文件,无需安装,放在开发目录下直接 import 即可,而且当时我醉心于 pure python 的概念,所以就这么一直用下来。
直到上周对代码做压力测试,某个流程中 json encoder 的时间居然耗掉了整整 1/3,而这个流程是最常用的功能之一,于是就寻找 json-py 的替代物。
首先想到的是 simplejson。由于 django 的内置,它可能是 python 界用得最广泛的 json 库了,而且其最新版本还包括了一个 c 的扩展以提高性能。一开始我也是对它寄予厚望,但 profiling 结果很让人郁闷:它的 decode 速度的确是比 json-py 快了不少(大概速度是3倍),但 encode 速度提升及其有限。
最后只好选择了 cjson,效率非常让人满意。
但接口友好程度就比上面两个差远了:一方面是 encode 对非 unicode 的数据类型支持不太好(比如 UTF-8 字符串里高8位字符都escape),我们只好把数据统统 str.decode('utf-8') 一下后再交给它;另一方面是它对中文 unicode 字符串的 decode 实现好像也是有问题,不过还好能想恶心办法绕过去。
结论:cjson效率最好,但兼容性一般;通常来说 simplejson 可能就足够了;如果不是 js 端会传来海量数据要 decode,json-py 也可以将就用,而且就一个文件,简单易import
附:写到本文的时候,发现一个叫 demjson 的项目四个月前刚发布新版本,而且号称自己是最快的纯python解决方案,也是一个文件就可用,看来值得一试。
而且为什么有了 _speedups.c 的 simplejson 速度和 json-py 比起来差别不大,也挺让人疑惑,啥时候有时间再重新测试看看。
评论
cJSON已经支持UTF8了
最新的版本的确已经支持UTF8,楼主所提的问题已经不存在了。