Author: Konstantin Lopuhin <[email protected]>
Branch: pickle-dumps
Changeset: r62356:15467e502b39
Date: 2013-03-15 20:56 +0400
http://bitbucket.org/pypy/pypy/changeset/15467e502b39/
Log: speed up pickle.dumps - use StringBuilder instead of StringIO - see
issue #979
diff --git a/lib-python/2/pickle.py b/lib-python/2/pickle.py
--- a/lib-python/2/pickle.py
+++ b/lib-python/2/pickle.py
@@ -34,6 +34,8 @@
import struct
import re
+from __pypy__.builders import StringBuilder
+
__all__ = ["PickleError", "PicklingError", "UnpicklingError", "Pickler",
"Unpickler", "dump", "dumps", "load", "loads"]
@@ -1409,11 +1411,27 @@
except ImportError:
from StringIO import StringIO
+
+class StringBuilderFile(object):
+ ''' pickle uses only file.write - provide this method,
+ use StringBuilder for speed
+ '''
+ def __init__(self):
+ self.builder = StringBuilder()
+
+ def write(self, data):
+ for x in data:
+ self.builder.append(data)
+
+ def getvalue(self):
+ return self.builder.build()
+
+
def dump(obj, file, protocol=None):
Pickler(file, protocol).dump(obj)
def dumps(obj, protocol=None):
- file = StringIO()
+ file = StringBuilderFile()
Pickler(file, protocol).dump(obj)
return file.getvalue()
diff --git a/lib_pypy/cPickle.py b/lib_pypy/cPickle.py
--- a/lib_pypy/cPickle.py
+++ b/lib_pypy/cPickle.py
@@ -2,7 +2,7 @@
# Reimplementation of cPickle, mostly as a copy of pickle.py
#
-from pickle import Pickler, dump, dumps, PickleError, PicklingError,
UnpicklingError, _EmptyClass
+from pickle import Pickler, dump, dumps, PickleError, PicklingError,
UnpicklingError, _EmptyClass, StringBuilderFile
from pickle import __doc__, __version__, format_version, compatible_formats
from types import *
from copy_reg import dispatch_table
@@ -120,7 +120,7 @@
@builtinify
def dumps(obj, protocol=None):
- file = StringIO()
+ file = StringBuilderFile()
Pickler(file, protocol).dump(obj)
return file.getvalue()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit