2013-08-29 19 views
6

何速いです:pickle.load()早いもの - ピクルされたディクショナリオブジェクトを読み込む、またはJSONファイルを読み込む - ディクショナリに?

または

simplejson.load()

を使用して辞書にJSONファイルをロード

(B)を使用して

(A ')unpickle化'(ロード)漬け辞書オブジェクト、

仮定:ピクルされたオブジェクトファイルは、ケースAの場合はすでに であり、JSONファイルがケースBの場合は既に存在します。

+8

インターネットでランダムな見知らぬ人に尋ねる理由は何ですか?自分自身を測定してください! – NPE

+3

これは実際にはコンテンツの種類、長さ、全体のサイズに依存します...また、あなたがそれをしている間に、cPickleとcjsonを試してみることもできます(後者は2.xx、cjsonは3 .xx)を試してみてください。 –

+2

@ Nisan.Hに加えて、はるかに高速であると主張する第三者(すなわちPyPI上)のJSONライブラリもあります。 – delnan

答えて

18

速度は実際にはデータの内容とサイズによって異なります。

しかし、いずれにせよ、(、Ubuntuの12.04のpython 2.7.3を)のは、例えば、JSONデータを取得し、より高速であるか見てみましょう:

  • pickle
  • cPickle
  • json
  • simplejson
  • ujson
  • yajlあなたが見ることができるように経由をunpickle化、

    pickle: 
    107.936687946 
    
    cpickle: 
    28.4231381416 
    
    json: 
    31.6450419426 
    
    simplejson: 
    20.5853149891 
    
    ujson: 
    16.9352178574 
    
    yajl: 
    18.9763481617 
    

    { 
        "glossary": { 
         "title": "example glossary", 
         "GlossDiv": { 
          "title": "S", 
          "GlossList": { 
           "GlossEntry": { 
            "ID": "SGML", 
            "SortAs": "SGML", 
            "GlossTerm": "Standard Generalized Markup Language", 
            "Acronym": "SGML", 
            "Abbrev": "ISO 8879:1986", 
            "GlossDef": { 
             "para": "A meta-markup language, used to create markup languages such as DocBook.", 
             "GlossSeeAlso": ["GML", "XML"] 
            }, 
            "GlossSee": "markup" 
           } 
          } 
         } 
        } 
    } 
    

    テストスクリプト:

    import timeit 
    
    import pickle 
    import cPickle 
    
    import json 
    import simplejson 
    import ujson 
    import yajl 
    
    
    def load_pickle(f): 
        return pickle.load(f) 
    
    
    def load_cpickle(f): 
        return cPickle.load(f) 
    
    
    def load_json(f): 
        return json.load(f) 
    
    
    def load_simplejson(f): 
        return simplejson.load(f) 
    
    
    def load_ujson(f): 
        return ujson.load(f) 
    
    
    def load_yajl(f): 
        return yajl.load(f) 
    
    
    print "pickle:" 
    print timeit.Timer('load_pickle(open("test.pickle"))', 'from __main__ import load_pickle').timeit() 
    
    print "cpickle:" 
    print timeit.Timer('load_cpickle(open("test.pickle"))', 'from __main__ import load_cpickle').timeit() 
    
    print "json:" 
    print timeit.Timer('load_json(open("test.json"))', 'from __main__ import load_json').timeit() 
    
    print "simplejson:" 
    print timeit.Timer('load_simplejson(open("test.json"))', 'from __main__ import load_simplejson').timeit() 
    
    print "ujson:" 
    print timeit.Timer('load_ujson(open("test.json"))', 'from __main__ import load_ujson').timeit() 
    
    print "yajl:" 
    print timeit.Timer('load_yajl(open("test.json"))', 'from __main__ import load_yajl').timeit() 
    

    出力このJSON構造を与える

test.jsontest.pickleファイルにダンプpickleはそれほど高速ではありません。cPickleは、pickling/unpicklingオプションを選択した場合、必ず行く方法です。 ujsonは、この特定のデータに関するこれらのjsonパーサーの間で有望です。

また、pypyPython JSON Performanceを参照)では、jsonおよびsimplejsonライブラリの方がはるかに高速です。

も参照してください:

それは結果がデータの他の種類とサイズに、特定のシステムでは異なることに留意することが重要です。

+0

うわー、かなり説明的な答え。私は、シンプソンソンがジョーンよりも面白いということさえ知らなかった。さらに、jsonの方が速い理由は何でしょうか? (私は、それがより簡単に構文解析し、任意のPythonオブジェクトを表すことができるいくつかのピクルス文字列を解析するよりも、辞書にjsonを変換するためだと推測している) –

+0

あなたの例でcpickleを使用すると何時になるのですか? –

+0

ちょっと待って、 'ujson'と' cPickle'を追加します。 – alecxe

関連する問題