[Python-Dev] int/float freelists vs pymalloc

M.-A. Lemburg mal at egenix.com
Fri Feb 8 23:34:17 CET 2008


On 2008-02-08 12:23, M.-A. Lemburg wrote:
> On 2008-02-08 08:21, Martin v. Löwis wrote:
>>> One of the hopes of having a custom allocator for Python was to be
>>> able to get rid off all free lists. For some reason that never happened.
>>> Not sure why. People were probably too busy with adding new
>>> features to the language at the time ;-)
>> Probably not. It's more that the free lists still outperformed pymalloc.
>>
>>> Something you could try to make PyMalloc perform better for the builtin
>>> types is to check the actual size of the allocated PyObjects and then
>>> make sure that PyMalloc uses arenas large enough to hold a good quantity
>>> of them, e.g. it's possible that the float types fall into the same
>>> arena as some other type and thus don't have enough "room" to use
>>> as free list.
>> I don't think any improvements can be gained here. PyMalloc carves
>> out pools of 4096 bytes from an arena when it runs out of blocks
>> for a certain size class, and then keeps a linked list of pools of
>> the same size class. So when many float objects get allocated,
>> you'll have a lot of pools of the float type's size class.
>> IOW, PyMalloc has always enough room.
> 
> Well, yes, it doesn't run out of memory, but if pymalloc needs
> to allocate lots of objects of the same size, then performance
> degrades due to the management overhead involved for checking
> the free pools as well as creating new arenas as needed.
> 
> To reduce this overhead, it may be a good idea to preallocate
> pools for common sizes and make sure they don't drop under a
> certain threshold.
> 
> Here's a list of a few object sizes in bytes for Python 2.5
> on an AMD64 machine:
> 
>>>> import mx.Tools
>>>> mx.Tools.sizeof(int(0))
> 24
>>>> mx.Tools.sizeof(float(0))
> 24
> 
> 8-bit strings are var objects:
> 
>>>> mx.Tools.sizeof(str(''))
> 40
>>>> mx.Tools.sizeof(str('a'))
> 41
> 
> Unicode objects use an external buffer:
> 
>>>> mx.Tools.sizeof(unicode(''))
> 48
>>>> mx.Tools.sizeof(unicode('a'))
> 48
> 
> Lists do as well:
> 
>>>> mx.Tools.sizeof(list())
> 40
>>>> mx.Tools.sizeof(list([1,2,3]))
> 40
> 
> Tuples are var objects:
> 
>>>> mx.Tools.sizeof(tuple())
> 24
>>>> mx.Tools.sizeof(tuple([1,2,3]))
> 48
> 
> Old style classes:
> 
>>>> class C: pass
> ...
>>>> mx.Tools.sizeof(C)
> 64
> 
> New style classes are a lot heavier:
> 
>>>> class D(object): pass
> ...
>>>> mx.Tools.sizeof(D)
> 848
>>>> mx.Tools.sizeof(type(2))
> 848
> 
> 
> As you can see, Integers and floats fall into the same pymalloc size
> class. What's strange in Andrew's result is that both integers
> and floats use the same free list technique and fall into the same
> pymalloc size class, yet the results are different.
> 
> The only difference that's apparent is that small integers are
> shared, so depending on the data set used for the test, fewer
> calls to pymalloc or the free list are made.

Here's the same on a 32-bit machine. Notice the differences:

>>> import mx.Tools
>>> mx.Tools.sizeof(int(0))
12
>>> mx.Tools.sizeof(float(0))
16
>>> mx.Tools.sizeof(str(''))
24
>>> mx.Tools.sizeof(str('a'))
25
>>> mx.Tools.sizeof(unicode(''))
24
>>> mx.Tools.sizeof(unicode('a'))
24
>>> mx.Tools.sizeof(list())
20
>>> mx.Tools.sizeof(list([1,2,3]))
20
>>> mx.Tools.sizeof(tuple())
12
>>> mx.Tools.sizeof(tuple([1,2,3]))
24
>>> class C: pass
>>> mx.Tools.sizeof(C)
32
>>> class D(object): pass
>>> mx.Tools.sizeof(D)
424
>>> mx.Tools.sizeof(type(2))
424

Floats use 4 bytes more than integers. However, they still fall
into the same pymalloc size class (16 bytes this time around).

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Feb 08 2008)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::


   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611


More information about the Python-Dev mailing list