mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Issue #9410: Various optimizations to the pickle module, leading to
speedups up to 4x (depending on the benchmark). Mostly ported from Unladen Swallow; initial patch by Alexandre Vassalotti.
This commit is contained in:
parent
350c7229be
commit
ea99c5c949
5 changed files with 1885 additions and 548 deletions
|
@ -1287,12 +1287,6 @@ def decode_long(data):
|
||||||
"""
|
"""
|
||||||
return int.from_bytes(data, byteorder='little', signed=True)
|
return int.from_bytes(data, byteorder='little', signed=True)
|
||||||
|
|
||||||
# Use the faster _pickle if possible
|
|
||||||
try:
|
|
||||||
from _pickle import *
|
|
||||||
except ImportError:
|
|
||||||
Pickler, Unpickler = _Pickler, _Unpickler
|
|
||||||
|
|
||||||
# Shorthands
|
# Shorthands
|
||||||
|
|
||||||
def dump(obj, file, protocol=None, *, fix_imports=True):
|
def dump(obj, file, protocol=None, *, fix_imports=True):
|
||||||
|
@ -1316,6 +1310,12 @@ def loads(s, *, fix_imports=True, encoding="ASCII", errors="strict"):
|
||||||
return Unpickler(file, fix_imports=fix_imports,
|
return Unpickler(file, fix_imports=fix_imports,
|
||||||
encoding=encoding, errors=errors).load()
|
encoding=encoding, errors=errors).load()
|
||||||
|
|
||||||
|
# Use the faster _pickle if possible
|
||||||
|
try:
|
||||||
|
from _pickle import *
|
||||||
|
except ImportError:
|
||||||
|
Pickler, Unpickler = _Pickler, _Unpickler
|
||||||
|
|
||||||
# Doctest
|
# Doctest
|
||||||
def _test():
|
def _test():
|
||||||
import doctest
|
import doctest
|
||||||
|
|
|
@ -1068,6 +1068,15 @@ class AbstractPickleTests(unittest.TestCase):
|
||||||
dumped = self.dumps(set([3]), 2)
|
dumped = self.dumps(set([3]), 2)
|
||||||
self.assertEqual(dumped, DATA6)
|
self.assertEqual(dumped, DATA6)
|
||||||
|
|
||||||
|
def test_large_pickles(self):
|
||||||
|
# Test the correctness of internal buffering routines when handling
|
||||||
|
# large data.
|
||||||
|
for proto in protocols:
|
||||||
|
data = (1, b'x' * (256 * 1024))
|
||||||
|
dumped = self.dumps(data, proto)
|
||||||
|
loaded = self.loads(dumped)
|
||||||
|
self.assertEqual(loaded, data)
|
||||||
|
|
||||||
|
|
||||||
# Test classes for reduce_ex
|
# Test classes for reduce_ex
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,18 @@ class PyPicklerTests(AbstractPickleTests):
|
||||||
return u.load()
|
return u.load()
|
||||||
|
|
||||||
|
|
||||||
|
class InMemoryPickleTests(AbstractPickleTests):
|
||||||
|
|
||||||
|
pickler = pickle._Pickler
|
||||||
|
unpickler = pickle._Unpickler
|
||||||
|
|
||||||
|
def dumps(self, arg, proto=None):
|
||||||
|
return pickle.dumps(arg, proto)
|
||||||
|
|
||||||
|
def loads(self, buf):
|
||||||
|
return pickle.loads(buf)
|
||||||
|
|
||||||
|
|
||||||
class PyPersPicklerTests(AbstractPersistentPicklerTests):
|
class PyPersPicklerTests(AbstractPersistentPicklerTests):
|
||||||
|
|
||||||
pickler = pickle._Pickler
|
pickler = pickle._Pickler
|
||||||
|
@ -95,7 +107,8 @@ def test_main():
|
||||||
tests.extend([CPicklerTests, CPersPicklerTests,
|
tests.extend([CPicklerTests, CPersPicklerTests,
|
||||||
CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
|
CDumpPickle_LoadPickle, DumpPickle_CLoadPickle,
|
||||||
PyPicklerUnpicklerObjectTests,
|
PyPicklerUnpicklerObjectTests,
|
||||||
CPicklerUnpicklerObjectTests])
|
CPicklerUnpicklerObjectTests,
|
||||||
|
InMemoryPickleTests])
|
||||||
support.run_unittest(*tests)
|
support.run_unittest(*tests)
|
||||||
support.run_doctest(pickle)
|
support.run_doctest(pickle)
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #9410: Various optimizations to the pickle module, leading to
|
||||||
|
speedups up to 4x (depending on the benchmark). Mostly ported from
|
||||||
|
Unladen Swallow; initial patch by Alexandre Vassalotti.
|
||||||
|
|
||||||
- The pprint module now supports printing OrderedDicts in their given
|
- The pprint module now supports printing OrderedDicts in their given
|
||||||
order (formerly, it would sort the keys).
|
order (formerly, it would sort the keys).
|
||||||
|
|
||||||
|
|
2373
Modules/_pickle.c
2373
Modules/_pickle.c
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue