web-dev-qa-db-ja.com

Python 2.6 JSONデコードパフォーマンス

Python 2.6のjsonモジュールを使用してJSONファイルをロードおよびデコードしています。ただし、現在、予想よりもパフォーマンスが低下しています。テストケースを使用しています。サイズは6MBで、json.loads()は20秒かかります。

jsonモジュールには、デコードを高速化するためのネイティブコードがいくつかあると思いましたか?

これが使用されているかどうかを確認するにはどうすればよいですか?

比較として、_python-cjson_モジュールをダウンロードしてインストールしたところ、同じテストケースでcjson.decode()に1秒かかりました。

Python 2.6で提供されるJSONモジュールを使用したいので、コードのユーザーが追加のモジュールをインストールする必要はありません。

(Mac OS Xで開発していますが、Windows XPでも同様の結果が得られます。)

45
James Austin

プラットフォームによって異なりますが、組み込みのjsonモジュールは simplejson に基づいており、Cの高速化は含まれていません。とにかく、simplejsonはpython-cjsonと同じくらい高速であることがわかったので、組み込みと同じインターフェースを持っていることは明らかなので、私はそれを好みます。

try:
    import simplejson as json
except ImportError:
    import json

これはしばらくの間、最良のイディオムであり、前方互換性を保ちながら、可能な場合はパフォーマンスを発揮するように思えます。

23
A. Coady

新しい Yajl-Yet Another JSON Library は非常に高速です。

yajl        serialize: 0.180  deserialize: 0.182  total: 0.362
simplejson  serialize: 0.840  deserialize: 0.490  total: 1.331
stdlib json serialize: 2.812  deserialize: 8.725  total: 11.537

ライブラリを自分で比較 できます。

更新:ltraJSON はさらに高速です。

30
Ivo Danihelka

同じファイルを10x解析していました。ファイルサイズは1,856,944バイト。

Python 2.6:

yajl        serialize: 0.294  deserialize: 0.334  total: 0.627
cjson       serialize: 0.494  deserialize: 0.276  total: 0.769
simplejson  serialize: 0.554  deserialize: 0.268  total: 0.823
stdlib json serialize: 3.917  deserialize: 17.508 total: 21.425

Python 2.7:

yajl        serialize: 0.289  deserialize: 0.312  total: 0.601
cjson       serialize: 0.232  deserialize: 0.254  total: 0.486
simplejson  serialize: 0.288  deserialize: 0.253  total: 0.540
stdlib json serialize: 0.273  deserialize: 0.256  total: 0.528

数値が結果と不釣り合いな理由がわかりません。新しいライブラリですか?

17
Tomas

ultraJSONを見てください https://github.com/esnme/ultrajson

ここで私のテスト(コード: https://Gist.github.com/lightcatcher/1136415

プラットフォーム:OS X 10.8.3 MBP 2.2 GHz Intel Core i7

JSON:

simplejson == 3.1.0

python-cjson == 1.0.5

jsonlib == 1.6.1

ujson == 1.30

yajl == 0.3.5

JSON Benchmark
2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)]
-----------------------------
ENCODING
simplejson: 0.293394s
cjson: 0.461517s
ujson: 0.222278s
jsonlib: 0.428641s
json: 0.759091s
yajl: 0.388836s

DECODING
simplejson: 0.556367s
cjson: 0.42649s
ujson: 0.212396s
jsonlib: 0.265861s
json: 0.365553s
yajl: 0.361718s
14
TONy.W

要求パッケージを使用して要求からの出力を解析している人のために、例えば:

res = requests.request(...)

text = json.loads(res.text)

これは、応答のコンテンツが大きい場合は非常に遅くなる可能性があります。たとえば、2017 MacBookでは6 MBで約45秒です。これは、jsonパーサーの速度が遅いことが原因ではなく、res.text呼び出しによる文字セットの判別が遅いことが原因です。

これを解決するには、res.textを呼び出す前に文字セットbeforeを設定し、 cchardet パッケージを使用します(以下も参照) ここ ):

if res.encoding is None:
    res.encoding = cchardet.detect(res.content)['encoding']

これにより、応答テキストのJSON解析がほぼ瞬時になります。

3
ganzpopp

インストールしたPython 2.6.1 on windows)を見ると、jsonパッケージは、ランタイムに組み込まれている__json_モジュールをロードします。Cjson speedups_モジュールの_ソースは here です。

_>>> import _json
>>> _json
<module '_json' (built-in)>
>>> print _json.__doc__
json speedups
>>> dir(_json)
['__doc__', '__name__', '__package__', 'encode_basestring_ascii', 'scanstring']
>>> 
_
2
gimel

たとえ _jsonが利用可能です。CPython2.6.6ではjsonのデコードが非常に遅いことに気づきました。他の実装と比較したことはありませんが、パフォーマンスが重要なループの内部では文字列操作に切り替えました。

1
Tobu