纯Python的JSON库性能比较:simplejson vs demjson
2009 5 23 02:20 AM 7309次查看
由于GAE上只能用纯Python的模块,所以C扩展的库就不考虑了,于是大致就只剩这3种了:simplejson、python-json和demjson。
流行度的话,由于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.62516221533demjson快了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'}
向下滚动可载入更多评论,或者点这里禁止自动加载。