On Jun 15, 1:04 am, [EMAIL PROTECTED] wrote:
> However it seems that marshal.dumps() for large objects has a
> quadratic performance issue which I'm assuming is that it grows its
> memory buffer in constant increments.

Looking at the source in 
http://svn.python.org/projects/python/trunk/Python/marshal.c
, it looks like the relevant fragment is in w_more():

      . . .
        size = PyString_Size(p->str);
        newsize = size + size + 1024;
        if (newsize > 32*1024*1024) {
                newsize = size + 1024*1024;
        }
        if (_PyString_Resize(&p->str, newsize) != 0) {
      . . .

When more space is needed, the resize operation over-allocates by
double the previous need plus 1K.  This should give amortized O(1)
performance just like list.append().

However, when that strategy requests more than 32Mb, the resizing
becomes less aggressive and grows only in 1MB blocks and giving your
observed nasty quadratic behavior.

Raymond
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to