2013-08-29 40 views
6

gì là nhanh hơn:Điều gì sẽ nhanh hơn - Đang tải một đối tượng từ điển đã được chọn hoặc Tải một tệp JSON - vào từ điển?

(A) 'Unpickling' (tải) một đối tượng từ điển ngâm, sử dụng pickle.load()

hoặc

(B) Đang tải một tập tin JSON để một cuốn từ điển sử dụng simplejson.load()

Giả sử: Tệp đối tượng ngâm tồn tại trong trường hợp A, và tệp JSON đã tồn tại trong trường hợp B.

+8

Tại sao yêu cầu người lạ ngẫu nhiên trên Internet? Tự đánh giá! – NPE

+3

Nó sẽ thực sự phụ thuộc vào loại nội dung, độ dài, và kích thước tổng thể ... Ngoài ra khi bạn đang ở đó, bạn cũng có thể muốn thử cPickle và cjson (sau này là cho 2.xx, cjson không có sẵn cho 3 .xx) trong thời gian dùng thử. –

+2

Ngoài những gì @ Nisan.H cho biết, cũng có thư viện JSON của bên thứ ba (tức là trên PyPI) yêu cầu nhanh hơn đáng kể. – delnan

Trả lời

18

Tốc độ thực sự phụ thuộc vào dữ liệu, đó là nội dung và kích thước.

Nhưng, dù sao, chúng ta hãy lấy một ví dụ dữ liệu json và xem những gì là nhanh hơn (Ubuntu 12.04, python 2.7.3):

Giving cấu trúc json này đổ vào test.jsontest.pickle file:

{ 
    "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" 
       } 
      } 
     } 
    } 
} 

kiểm tra kịch bản:

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() 

Output:

pickle: 
107.936687946 

cpickle: 
28.4231381416 

json: 
31.6450419426 

simplejson: 
20.5853149891 

ujson: 
16.9352178574 

yajl: 
18.9763481617 

Như bạn thấy, unpickling qua pickle không phải là nhanh chóng ở tất cả - cPickle là definetely con đường để đi nếu bạn chọn pickling/unpickling tùy chọn. ujson trông đầy hứa hẹn trong số các trình phân tích cú pháp json này trên dữ liệu cụ thể này.

Ngoài ra, các thư viện jsonsimplejson tải nhanh hơn trên pypy (xem Python JSON Performance).

Xem thêm:

Điều quan trọng cần lưu ý là các kết quả có thể khác nhau trên hệ thống cụ thể của bạn, về chủng loại và kích thước của dữ liệu khác.

+0

Wow, câu trả lời khá minh họa. Tôi thậm chí không biết simplejson là fater hơn json. Hơn nữa, những gì có thể là lý do của cách json được nhanh hơn? (Tôi suy đoán đó là vì nó dễ phân tích cú pháp và chuyển đổi json thành từ điển hơn là phân tích cú pháp chuỗi có thể đại diện cho bất kỳ đối tượng python nào.) –

+0

Bạn nhận được gì khi sử dụng cpickle với ví dụ của mình? –

+0

Chỉ cần một giây, sẽ thêm 'ujson' và' cPickle'. – alecxe