json和simplejson Python模块之间有什么区别?
我看到很多项目使用simplejson
这个模块,而不是标准库里的json
模块。而且,simplejson
还有很多不同的版本。那为什么大家会选择这些替代品,而不是标准库里的那个呢?
13 个回答
这些回答都不是很有帮助,因为它们受时间影响。
经过我自己的研究,我发现如果你把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倍。
我得不同意其他人的说法: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秒
从处理速度来看,json
比simplejson
快;而在加载数据时,simplejson
更快。
因为我现在在做一个网络服务,所以dumps()
的速度更重要——而且使用标准库总是更受欢迎。
另外,cjson
在过去四年里没有更新,所以我不会去用它。
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