標準ライブラリのモジュールのsimplejson
代わりにモジュールを使用する多くのプロジェクトを見てきました。json
また、多くの異なるsimplejson
モジュールがあります。標準ライブラリのものではなく、なぜこれらの代替手段を使用するのでしょうか?
13 に答える
json
は simplejson
、stdlib に追加されます。しかし、json
2.6 で追加されたsimplejson
ため、より多くの Python バージョン (2.4+) で作業できるという利点があります。
simplejson
また、Python よりも頻繁に更新されるため、最新バージョンが必要な (または必要な)simplejson
場合は、可能であればそれ自体を使用することをお勧めします。
私の意見では、どちらか一方をフォールバックとして使用することをお勧めします。
try:
import simplejson as json
except ImportError:
import json
これらの回答はすべて、時間に敏感であるため、あまり役に立ちません。
私自身の調査を行った後、最新バージョンに更新し続けるとsimplejson
、ビルトインよりも実際に高速であることがわかりました。
pip/easy_install
ubuntu 12.04に2.3.2をインストールしたかったのですが、最新simplejson
バージョンが実際には3.3.0であることがわかったので、更新して時間テストを再実行しました。
simplejson
json
ロード時にビルトインよりも約 3 倍高速ですsimplejson
json
組み込みの at dumpsよりも約 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))
更新:最近、いくつかの基本的なテストよりも ~3 倍速く実行されるujsonというライブラリに出会いました。simplejson
私はjson、simplejson、cjsonのベンチマークを行ってきました。
- cjson は最速です
- simplejson は cjson とほぼ同等です
- json は simplejson よりも約 10 倍遅い
$ 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
一部の値は、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]'
プロジェクトが simplejson を使用するもう 1 つの理由は、ビルトイン json にはもともと C の高速化が含まれていなかったため、パフォーマンスの違いが顕著だったからです。
組み込みjson
モジュールは Python 2.6 に含まれています。Python < 2.6 のバージョンをサポートするプロジェクトには、フォールバックが必要です。多くの場合、そのフォールバックはsimplejson
.
Python json ライブラリの (現在は古い) 比較は次のとおりです。
Python の JSON モジュールの比較(アーカイブ リンク)
この比較の結果に関係なく、Python 2.6 を使用している場合は、標準ライブラリ json を使用する必要があります。そして..それ以外の場合は、単純なjsonを使用することもできます。
simplejsonモジュールはjsonよりも単純に1.5倍高速です(私のコンピューターでは、simplejson2.1.1とPython2.7 x86を使用しています)。
必要に応じて、ベンチマークを試すことができます。http: //abral.altervista.org/jsonpickle-bench.zip 私のPCでは、simplejsonはcPickleよりも高速です。あなたのベンチマークも知りたいです!
おそらく、Coadyが言ったように、simplejsonとjsonの違いは、simplejsonに_speedups.cが含まれていることです。では、なぜPython開発者はsimplejsonを使用しないのですか?
Python3 では、 の文字列の場合b'bytes'
、コンテンツをロードする前にコンテンツ を取得するjson
必要があります。がこれを処理するので、 を実行できます。.decode()
simplejson
simplejson.loads(byte_string)
Python 2.6 用の simplejson をインストールしようとしていたときに、この質問に出くわしました。json ファイルを OrderedDict としてロードするには、json.load() の「object_pairs_hook」を使用する必要がありました。最近のバージョンの Python に慣れていたので、Python 2.6 の json モジュールに「object_pairs_hook」が含まれていないことに気がつかなかったので、この目的のために simplejson をインストールする必要がありました。個人的な経験から、これが標準のjsonモジュールではなくsimplejsonを使用する理由です。