纯Python的JSON库性能比较:simplejson vs demjson

标签:Python, 性能

虽然Python对象转成JSON对象还算简单,不过对于我这种不喜欢重复劳动的人来说,还是用别人的库比较安逸。
由于GAE上只能用纯Python的模块,所以C扩展的库就不考虑了,于是大致就只剩这3种了:simplejsonpython-jsondemjson

流行度的话,由于simplejson是django的内置模块,自然最高。demjson则是个相对而言比较新的模块。
由于听说python-json性能不佳,而且2005年后就没更新了,所以就懒得测了。
于是就变成simplejson vs demjson了。

先说下版本:
Python:2.5.4
GAE SDK:1.2.2
simplejson:2.0.9
demjson:1.4

再比较下文件:
simplejson是一个包,里面有5个文件。而demjson是单个文件,不过比simplejson的5个文件加起来还大一倍…

不废话了,赶紧测试。

先是编译JSON:
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import memcache
import simplejson
import demjson
from timeit import Timer

class JsonTest(webapp.RequestHandler):
  def get(self):
    d = {}
    for i in xrange(100):
      d[i] = u'哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'
    memcache.set('d', d)
    setup = '''\
from google.appengine.api import memcache
import simplejson
import demjson
d = memcache.get('d')'''

    t1 = Timer('simplejson.dumps(d)', setup).timeit(100)
    t2 = Timer('demjson.encode(d)', setup).timeit(100)

    self.response.out.write('%s %s' % (t1, t2))

application = webapp.WSGIApplication([('/json/', JsonTest),])
run_wsgi_app(application)
结果:
5.19135889058 1.62516221533
demjson快了3倍多,很强大。
考虑到demjson输出的是unicode,而GAE对外输出时会自动转成string,所以将demjson.encode(d)改成demjson.encode(d).encode("utf8")再次测试,结果:
5.15618079144 1.63971434892
接着看解析JSON:
class JsonTest(webapp.RequestHandler):
  def get(self):
    d = {}
    for i in xrange(100):
      d[i] = u'哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'
    memcache.set('d', simplejson.dumps(d)) # 不知道为什么,用demjson.encode(d)的话,simplejson.loads(d)会出错

    setup = '''\
from google.appengine.api import memcache
import simplejson
import demjson
d = memcache.get('d')'''

    t1 = Timer('simplejson.loads(d)', setup).timeit(50)
    t2 = Timer('demjson.decode(d)', setup).timeit(50)

    self.response.out.write('%s %s' % (t1, t2))
结果:
1.76071409144 6.35170093493
情况完全反了过来,simplejson快了3倍多…

看来如果要追求性能的话,载入用simplejson,输出用demjson。
写法大概这样:
>>> from demjson import encode as encodeJSON
>>> from simplejson import loads as decodeJSON
>>> d = {'a': '123', 'b': u'哈哈'}
>>> encodeJSON(d)
u'{"a":"123","b":"\u54c8\u54c8"}'
>>> decodeJSON(encodeJSON(d))
{u'a': u'123', u'b': u'\u54c8\u54c8'}

1条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?