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

415 投票
13 回答
154745 浏览
提问于 2025-04-15 11:05

我看到很多项目使用simplejson这个模块,而不是标准库里的json模块。而且,simplejson还有很多不同的版本。那为什么大家会选择这些替代品,而不是标准库里的那个呢?

13 个回答

29

这些回答都不是很有帮助,因为它们受时间影响

经过我自己的研究,我发现如果你把simplejson更新到最新版本,它确实比内置的快。

pip/easy_install在ubuntu 12.04上想要安装2.3.2版本,但我发现最新的simplejson版本其实是3.3.0,所以我更新了它,然后重新进行了时间测试。

  • simplejson在加载数据时比内置的json快大约3倍
  • simplejson在保存数据时比内置的json快大约30%

免责声明:

以上说法是在python-2.7.3和simplejson 3.3.0(带有C语言加速)下得出的。为了确保我的回答也不受时间影响,你应该自己进行测试,因为不同版本之间差异很大;没有简单的答案是不受时间影响的。

如何判断simplejson中是否启用了C语言加速:

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

更新:我最近发现了一个叫做ujson的库,它在一些基本测试中比simplejson快大约3倍。

88

我得不同意其他人的说法:Python 2.7自带的json库不一定比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更快。

因为我现在在做一个网络服务,所以dumps()的速度更重要——而且使用标准库总是更受欢迎。

另外,cjson在过去四年里没有更新,所以我不会去用它。

424

json 是一个用来处理JSON数据的模块,它是 在Python 2.6版本中新增的,并且它是基于 simplejson 的。虽然 json 是在2.6版本中加入的,但 simplejson 可以在更多的Python版本上使用(从2.4开始)。

另外,simplejson 更新的频率比Python本身要高,所以如果你需要最新的功能,最好直接使用 simplejson

在我看来,使用这两个模块中的一个作为备用是个不错的做法。

try:
    import simplejson as json
except ImportError:
    import json

撰写回答