Speed tests for *json and cPickle in Python(j2labs.tumblr.com)
j2labs.tumblr.com
Speed tests for *json and cPickle in Python
http://j2labs.tumblr.com/post/4262756632/speed-tests-for-json-and-cpickle-in-python
21 comments
He doesn't use the cPickle binary format, which is significantly faster: http://docs.python.org/library/pickle.html#pickle.HIGHEST_PR...
Thanks for pointing this out.
I am going to do some follow up tests to cover the advice I got here. I will include this, tnetstrings and decodes too.
I am going to do some follow up tests to cover the advice I got here. I will include this, tnetstrings and decodes too.
Any interests in also including Google's Protocol Buffers and Facebook's Thrift since it would appear your intentions are to use these blobs in an RPC?
Python 2.7 on Ubuntu:
$ python -mtimeit -s "from json import dumps;
d = {
'foo': 'bar',
'food': 'barf',
'good': 'bars',
'dood': 'wheres your car?',
'wheres your car': 'dude?',
}
" "dumps(d)"
100000 loops, best of 3: 6.89 usec per loop
$ python -mtimeit -s "from cPickle import dumps;
d = {
'foo': 'bar',
'food': 'barf',
'good': 'bars',
'dood': 'wheres your car?',
'wheres your car': 'dude?',
}
" "dumps(d)"
100000 loops, best of 3: 7.78 usec per loop
So `json` seems faster than `cPickle`. Right? Wrong!: $ python -mtimeit -s "from cPickle import dumps;
d = {
'foo': 'bar',
'food': 'barf',
'good': 'bars',
'dood': 'wheres your car?',
'wheres your car': 'dude?',
}
" "dumps(d, -1)"
100000 loops, best of 3: 3.59 usec per loopWhat does the "-1" dump argument mean in 3rd example?
The equivalent of using pickle.HIGHEST_PROTOCOL or pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL) -- any negative value will force highest protocol.
Apple and oranges (even though they're mostly used for the same thing). pickle is a Turing complete language used to recreate python objects, while json is only used for serialization. pickle is slightly more powerful, but should also not be used to load untrusted data. See http://nadiana.com/python-pickle-insecure
We were just talking about this a few weeks back, with a few more libraries compared with interesting results: https://convore.com/python/faster-json-library/
demjson looks crazy fast.
I'm confused, is cjson still recommended? Is it still maintained? Its status seems ambiguous based on the PyPi discussion. Furthermore it seems there's a number of issues with cjson that need to be resolved...
When I tested cjson (~6 months ago?) it had bugs with escaping - strings containing quotes and/or backslashes would be encoded/decoded incorrectly. Not recommended, unless there have been fixes since then.
Based on the PyPi page for cjson, the comments seem to indicate many problems still persist, notwithstanding new updates that have yet to be pushed
My understanding is that cjson is not recommended or maintained.
Maybe our information is out of date, but here's what we learned:
https://github.com/jsonpickle/jsonpickle/commit/0b97652e4102...
jsonpickle: Remove cjson support
"First, please don't use cjson for anything. It's got multiple bugs and misfeatures, and is generally unsuited for anything except impressive benchmarks. It was easier to write my own library, from scratch, than try to fix cjson."
-- John Millikin, author of jsonlib
https://github.com/jsonpickle/jsonpickle/commit/0b97652e4102...
jsonpickle: Remove cjson support
"First, please don't use cjson for anything. It's got multiple bugs and misfeatures, and is generally unsuited for anything except impressive benchmarks. It was easier to write my own library, from scratch, than try to fix cjson."
-- John Millikin, author of jsonlib
Here are some more relevant links:
http://news.ycombinator.com/item?id=529104
http://metaoptimize.com/blog/2009/03/22/fast-deserialization...
http://news.ycombinator.com/item?id=529104
http://metaoptimize.com/blog/2009/03/22/fast-deserialization...
sounds like the kind of project a decent coder could make big improvements on fast
insane
Python 2.5 -- including pickle's (faster) bin mode