json和simplejson Python模块有什么区别?

我看到很多使用simplejson模块的项目,而不是标准库中的json模块。 此外,还有许多不同的simplejson模块。 为什么会使用这些替代品,而不是标准库中的那个?

jsonsimplejson ,添加到stdlib。 但是由于json是在2.6中添加的,所以simplejson在更多的Python版本(2.4+)上工作的优势。

simplejson也比Python更新更频繁,所以如果你需要(或者想要)最新版本,最好是尽可能使用simplejson本身。

在我看来,一个好的做法是使用其中一个作为后备。

 try: import simplejson as json except ImportError: import json 

我不同意其他答案:内置的json库(在Python 2.7中)不一定比simplejson慢。 它也没有这个令人讨厌的unicode错误 。

这是一个简单的基准:

 import json import simplejson from timeit import repeat NUMBER = 100000 REPEAT = 10 def compare_json_and_simplejson(data): """Compare json and simplejson - dumps and loads""" compare_json_and_simplejson.data = data compare_json_and_simplejson.dump = json.dumps(data) assert json.dumps(data) == simplejson.dumps(data) result = min(repeat("json.dumps(compare_json_and_simplejson.data)", "from __main__ import json, compare_json_and_simplejson", repeat = REPEAT, number = NUMBER)) print " json dumps {} seconds".format(result) result = min(repeat("simplejson.dumps(compare_json_and_simplejson.data)", "from __main__ import simplejson, compare_json_and_simplejson", repeat = REPEAT, number = NUMBER)) print "simplejson dumps {} seconds".format(result) assert json.loads(compare_json_and_simplejson.dump) == data result = min(repeat("json.loads(compare_json_and_simplejson.dump)", "from __main__ import json, compare_json_and_simplejson", repeat = REPEAT, number = NUMBER)) print " json loads {} seconds".format(result) result = min(repeat("simplejson.loads(compare_json_and_simplejson.dump)", "from __main__ import simplejson, compare_json_and_simplejson", repeat = REPEAT, number = NUMBER)) print "simplejson loads {} seconds".format(result) print "Complex real world data:" COMPLEX_DATA = {'status': 1, 'timestamp': 1362323499.23, 'site_code': 'testing123', 'remote_address': '212.179.220.18', 'input_text': u'ny monday for less than \u20aa123', 'locale_value': 'UK', 'eva_version': 'v1.0.3286', 'message': 'Successful Parse', 'muuid1': '11e2-8414-a5e9e0fd-95a6-12313913cc26', 'api_reply': {"api_reply": {"Money": {"Currency": "ILS", "Amount": "123", "Restriction": "Less"}, "ProcessedText": "ny monday for less than \\u20aa123", "Locations": [{"Index": 0, "Derived From": "Default", "Home": "Default", "Departure": {"Date": "2013-03-04"}, "Next": 10}, {"Arrival": {"Date": "2013-03-04", "Calculated": True}, "Index": 10, "All Airports Code": "NYC", "Airports": "EWR,JFK,LGA,PHL", "Name": "New York City, New York, United States (GID=5128581)", "Latitude": 40.71427, "Country": "US", "Type": "City", "Geoid": 5128581, "Longitude": -74.00597}]}}} compare_json_and_simplejson(COMPLEX_DATA) print "\nSimple data:" SIMPLE_DATA = [1, 2, 3, "asasd", {'a':'b'}] compare_json_and_simplejson(SIMPLE_DATA) 

和我的系统上的结果(Python 2.7.4,Linux 64位):

复杂的现实世界数据:
json转储1.56666707993秒
simplejson转储2.25638604164秒
json加载2.71256899834秒
simplejson加载1.29233884811秒

简单的数据:
json转储0.370109081268秒
simplejson转储0.574181079865秒
json加载0.422876119614秒
simplejson加载0.270955085754秒

对于倾销, jsonsimplejson更快。 对于加载, simplejson更快。

由于我目前正在构build一个Web服务,所以dumps()更重要,而且使用标准库总是首选。

另外, cjson在过去4年没有更新,所以我不会去碰它。

所有这些答案都不是很有帮助,因为它们是时间敏感的

在做了一些我自己的研究之后,我发现simplejson确实比内build的更快, 如果你保持更新到最新版本。

pip/easy_install想要在ubuntu 12.04上安装2.3.2,但是在find最新的simplejson版本实际上是3.3.0之后,我更新了它并重新进行了testing。

  • simplejson速度比内置的json快3倍
  • simplejson比dump内核json快大约30%

免责声明:

上面的语句是python-2.7.3和simplejson 3.3.0(带有c加速)为了确保我的答案也不是时间敏感的,你应该运行你自己的testing来检查,因为它在版本之间变化很大; 有没有简单的答案是不是时间敏感的。

如何判断在simplejson中是否启用C加速:

 import simplejson # If this is True, then c speedups are enabled. print bool(getattr(simplejson, '_speedups', False)) 

更新:我最近遇到一个名为ujson的库,比simplejson执行速度快一些,具有一些基本的testing。

我一直在基准json,simplejson和cjson。

  • cjson是最快的
  • simplejson与cjson差不多
  • json比simplejson慢10倍左右

http://pastie.org/1507411

 $ python test_serialization_speed.py -------------------- Encoding Tests -------------------- Encoding: 100000 x {'m': 'asdsasdqwqw', 't': 3} [ json] 1.12385 seconds for 100000 runs. avg: 0.011239ms [simplejson] 0.44356 seconds for 100000 runs. avg: 0.004436ms [ cjson] 0.09593 seconds for 100000 runs. avg: 0.000959ms Encoding: 10000 x {'m': [['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19]], 't': 3} [ json] 7.76628 seconds for 10000 runs. avg: 0.776628ms [simplejson] 0.51179 seconds for 10000 runs. avg: 0.051179ms [ cjson] 0.44362 seconds for 10000 runs. avg: 0.044362ms -------------------- Decoding Tests -------------------- Decoding: 100000 x {"m": "asdsasdqwqw", "t": 3} [ json] 3.32861 seconds for 100000 runs. avg: 0.033286ms [simplejson] 0.37164 seconds for 100000 runs. avg: 0.003716ms [ cjson] 0.03893 seconds for 100000 runs. avg: 0.000389ms Decoding: 10000 x {"m": [["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19]], "t": 3} [ json] 37.26270 seconds for 10000 runs. avg: 3.726270ms [simplejson] 0.56643 seconds for 10000 runs. avg: 0.056643ms [ cjson] 0.33007 seconds for 10000 runs. avg: 0.033007ms 

我发现一个API不兼容与Python 2.7 vs simplejson 3.3.1是在输出产生str或unicode对象。 例如

 >>> from json import JSONDecoder >>> jd = JSONDecoder() >>> jd.decode("""{ "a":"b" }""") {u'a': u'b'} 

VS

 >>> from simplejson import JSONDecoder >>> jd = JSONDecoder() >>> jd.decode("""{ "a":"b" }""") {'a': 'b'} 

如果首选项是使用simplejson,则可以通过将参数string强制转换为unicode来解决此问题,如下所示:

 >>> from simplejson import JSONDecoder >>> jd = JSONDecoder() >>> jd.decode(unicode("""{ "a":"b" }""", "utf-8")) {u'a': u'b'} 

强制确实需要知道原始字符集,例如:

 >>> jd.decode(unicode("""{ "a": "ξηθννββωφρες" }""")) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 8: ordinal not in range(128) 

这是不会解决问题40

内置的json模块包含在Python 2.6中。 任何支持Python版本2.6的项目都需要有一个回退。 在许多情况下,这种回退是简单的。

项目使用simplejson的另一个原因是内置的json本来并没有包含它的C加速,所以性能差异是显而易见的。

Python(json)库的(现在已经过时的)比较:

比较Python的JSON模块 ( 存档链接 )

不pipe这个比较结果如何,如果你使用Python 2.6,你应该使用标准库json。 而且..不如使用simplejson,否则。

simplejson模块比json快了1.5倍(在我的电脑上,使用simplejson 2.1.1和Python 2.7 x86)。

如果你想,你可以尝试基准: http : //abral.altervista.org/jsonpickle-bench.zip在我的电脑上,simplejson比cPickle快。 我也想知道你的基准!

正如Coady所说的,simplejson和json的区别在于simplejson包含_speedups.c。 那么,为什么Python开发者不使用simplejson呢?

一些值在simplejson和json之间有不同的序列化。

值得注意的是, collections.namedtuple实例被json序列化为数组,而被simplejson作为对象序列化。 您可以通过将namedtuple_as_object=False传递给simplejson.dump来覆盖此行为,但默认情况下行为不匹配。

 >>> import collections, simplejson, json >>> TupleClass = collections.namedtuple("TupleClass", ("a", "b")) >>> value = TupleClass(1, 2) >>> json.dumps(value) '[1, 2]' >>> simplejson.dumps(value) '{"a": 1, "b": 2}' >>> simplejson.dumps(value, namedtuple_as_object=False) '[1, 2]' 

我偶然发现了这个问题,因为我正在为Python 2.6安装simplejson。 我需要使用json.load()的'object_pairs_hook'来加载一个JSON文件作为OrderedDict。 熟悉更新版本的Python我没有意识到Python 2.6的json模块不包含“object_pairs_hook”,所以我不得不为此安装simplejson。 从个人经验来看,这就是为什么我使用simplejson而不是标准的json模块。

在python3中,如果你是一串b'bytes' ,那么在使用json你必须.decode()对内容进行.decode()simplejson照顾这个,所以你可以做simplejson.loads(byte_string)