[Python-3000] Free list for small longs

Christian Heimes lists at cheimes.de
Wed Feb 6 00:51:20 CET 2008


Brett Cannon wrote:
> Well, I am a little leery of another free list. I personally don't
> love the fact that there are various caches and free lists laying
> about in the code without a central place to turn them off or clear
> them (or at least list them in a comment somewhere). And the problem
> with the free lists that the caches don't have is that they assume
> everyone gets a performance perk from them when there is a chance no
> one will ever touch a thing in the free lists.

I understand your objection. Most free lists and caches are limited but
some are not. I'm worried about the float and int blocks. Python's
memory management never frees an int or float block. Code like

>>> x = [float(i) for i in list(range(1000000))]
>>> del x

creates a million float and int objects but *never* frees the memory
until Python exists. It's a pathologic case but it shows a problem. I've
started to implement an API to compact the free lists,
PyNAME_CompactFreelist() and sys._compact_freelists(). My new
sys._compact_freelists() deallocates the float and int blocks which do
not contain a referenced object.

Most free lists are limited except the int (2.x only ) and float blocks.
The overview may not be complete and 2.x may have more free lists.

bytesobject
-----------
no free list, only a single nullbyte

classobject
-----------
unlimited *free_list of PyMethodObject

dictobject
----------
*free_dicts[] limited to 80 entries

frameobject
-----------
a zombie frame on each code object
limited *free_list (linked list) with 200 entries max

floatobject
-----------
unlimited blocks of allocated floats with 1000 entries each
The blocks are a single linked list and the free floats are
linked by ob_type (ob_type points to the next free float).

intobject (2.x)
---------------
same as floatobject

listobject
----------
*free_lists[] limited to 80 entries

longobject
----------
cache for small number between -5 and +256
my patch for a limited free list

methodobject
------------
unlimited *free_list of PyCFunctionObject

setobject
---------
*free_sets[] limited to 80 entries

stringobject
------------
cache for nullstring and strings with one entry
interned strings (2.x only)

tupleobject
-----------
20 free lists for tuples with up to 20 entries. Each free list is
limited to 2000 entries.

unicodeobject
-------------
*unicode_freelist limited to 1024 entries


Christian



More information about the Python-3000 mailing list