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

Reply via email to