Python 2.6 JSON 解码性能
我在用Python 2.6的json
模块来加载和解码JSON文件。不过,我发现它的速度比我预期的要慢。我用的测试案例文件有6MB大,而json.loads()
的解码时间居然要20秒。
我以为json
模块应该有一些原生代码来加速解码呢?
我该怎么检查这个功能是否被使用了呢?
为了做个对比,我下载并安装了python-cjson
模块,结果cjson.decode()
在同样的测试案例下只花了1秒钟。
我更希望使用Python 2.6自带的JSON模块,这样我的代码用户就不需要额外安装其他模块了。
(我是在Mac OS X上开发的,但在Windows XP上也得到了类似的结果。)
7 个回答
17
我重复解析同一个文件10次。这个文件的大小是1,856,944字节。
使用Python 2.6:
yajl serialize: 0.294 deserialize: 0.334 total: 0.627
cjson serialize: 0.494 deserialize: 0.276 total: 0.769
simplejson serialize: 0.554 deserialize: 0.268 total: 0.823
stdlib json serialize: 3.917 deserialize: 17.508 total: 21.425
使用Python 2.7:
yajl serialize: 0.289 deserialize: 0.312 total: 0.601
cjson serialize: 0.232 deserialize: 0.254 total: 0.486
simplejson serialize: 0.288 deserialize: 0.253 total: 0.540
stdlib json serialize: 0.273 deserialize: 0.256 total: 0.528
我不太明白为什么你的结果和这些数字差别这么大。我猜是因为使用了更新的库?
31
新的 Yajl - 又一个 JSON 库 非常快。
yajl serialize: 0.180 deserialize: 0.182 total: 0.362
simplejson serialize: 0.840 deserialize: 0.490 total: 1.331
stdlib json serialize: 2.812 deserialize: 8.725 total: 11.537
你可以 自己比较这些库。
更新: UltraJSON 甚至更快。
23
这可能因平台而异,但内置的 json 模块是基于 simplejson 的,并没有包含 C 语言的加速功能。不过我发现 simplejson 的速度和 python-cjson 一样快,所以我更喜欢使用它,因为它的接口和内置的 json 模块是一样的。
try:
import simplejson as json
except ImportError:
import json
在我看来,这种写法在一段时间内都是最好的选择,它在有性能提升的情况下能发挥作用,同时又能向后兼容。