json和simplejson Python模塊之間有什麼區別?

我已經看到許多項目使用了simplejson模塊而不是標準庫中的json模塊。 另外,有許多不一樣的simplejson模塊。 爲何要使用這些替代方法而不是標準庫中的替代方法? python


#1樓

我必須不一樣意其餘答案:內置json庫(在Python 2.7中)不必定比simplejson慢。 它也沒有這個煩人的unicode錯誤git

這是一個簡單的基準: json

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位)上的結果: ubuntu

複雜的現實世界數據:
json轉儲1.56666707993秒
simplejson轉儲2.25638604164秒
json載入2.71256899834秒
simplejson加載1.29233884811秒 api

簡單數據:
json轉儲0.370109081268秒
simplejson轉儲0.574181079865秒
json加載0.422876119614秒
simplejson加載0.270955085754秒 less

對於轉儲, json快於simplejson 。 對於加載, simplejson更快。 測試

因爲我當前正在構建Web服務,所以dumps()更爲重要-而且始終首選使用標準庫。 jsonp

另外, cjson在過去4年中未更新,所以我不會去碰它。 ui


#2樓

全部這些答案都不太有用,由於它們對時間敏感this

通過一些我本身的研究,我發現, 若是您將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 speedups),而且爲了確保個人回答也不對時間敏感,您應該運行本身的測試以進行檢查,由於版本之間的差別很大; 沒有時間敏感的簡單答案。

如何判斷是否在simplejson中啓用了C加速:

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

更新:我最近遇到了一個名爲ujson的庫,在進行一些基本測試後,該庫的執行速度比simplejson快3倍。


#3樓

我發現與Python 2.7和simplejson 3.3.1的API不兼容之處在於輸出是生成str對象仍是unicode對象。 例如

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

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

若是首選項是使用simplejson,則能夠經過將參數字符串強制爲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


#4樓

我在爲Python 2.6安裝simplejson時遇到了這個問題。 我須要使用json.load()的'object_pairs_hook'來將json文件加載爲OrderedDict。 熟悉最新版本的Python時,我沒有意識到Python 2.6的json模塊不包含'object_pairs_hook',所以我爲此目的必須安裝simplejson。 從我的經驗來看,這就是爲何我使用simplejson而不是標準json模塊的緣由。


#5樓

simplejson模塊僅比json快1.5倍(在個人計算機上,使用simplejson 2.1.1和Python 2.7 x86)。

若是須要,能夠嘗試進行基準測試: http : //abral.altervista.org/jsonpickle-bench.zip在個人PC上,simplejson比cPickle更快。 我也想知道您的基準!

就像Coady所說,simplejson和json之間的區別多是simplejson包含_speedups.c。 那麼,爲何python開發人員不使用simplejson?

相關文章
相關標籤/搜索