]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
* Optimized list appends and pops by making fewer calls the underlying system
authorRaymond Hettinger <python@rcn.com>
Fri, 13 Feb 2004 11:36:39 +0000 (11:36 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 13 Feb 2004 11:36:39 +0000 (11:36 +0000)
commit4bb9540dd6eddaf60b908796c2412696a8870bd1
treef2989cf9d6895dec915f307b40cd6e9a276991ce
parent4a8d42f73f9767622f32468c02cefe616ccb34cf
* Optimized list appends and pops by making fewer calls the underlying system
  realloc().  This is achieved by tracking the overallocation size in a new
  field and using that information to skip calls to realloc() whenever
  possible.

* Simplified and tightened the amount of overallocation.  For larger lists,
  this overallocates by 1/8th (compared to the previous scheme which ranged
  between 1/4th to 1/32nd over-allocation).  For smaller lists (n<6), the
  maximum overallocation is one byte (formerly it could be upto eight bytes).
  This saves memory in applications with large numbers of small lists.

* Eliminated the NRESIZE macro in favor of a new, static list_resize function
  that encapsulates the resizing logic.  Coverting this back to macro would
  give a small (under 1%) speed-up.  This was too small to warrant the loss
  of readability, maintainability, and de-coupling.

* Some functions using NRESIZE had grown unnecessarily complex in their
  efforts to bend to the macro's calling pattern.  With the new list_resize
  function in place, those other functions could be simplified.  That is
  being saved for a separate patch.

* The ob_item==NULL check could be eliminated from the new list_resize
  function.  This would entail finding each piece of code that sets ob_item
  to NULL and adding a new line to invalidate the overallocation tracking
  field.  Rather than impose a new requirement on other pieces of list code,
  it was preferred to leave the NULL check in place and retain the benefits
  of decoupling, maintainability and information hiding (only PyList_New()
  and list_sort() need to know about the new field).  This approach also
  reduces the odds of breaking an extension module.

(Collaborative effort by Raymond Hettinger, Hye-Shik Chang, Tim Peters,
 and Armin Rigo.)
Include/listobject.h
Misc/NEWS
Objects/listobject.c