Guido van Rossum schrieb:
> I think the test isn't hardly focused enough on int allocation. I
> wonder if you could come up with a benchmark that repeatedly allocates
> 100s of 1000s of ints and then deletes them? 

The question is: where to store them? In a pre-allocated list, or in a
growing list?

def t3():
    m = [0]*100000
    s = time.time()
    i = 0
    for i in xrange(100):
        for k in xrange(100000):
            m[k] = k
    print "Test 3",time.time()-s

def t4():
    s = time.time()
    i = 0
    for i in xrange(100):
        m = []
        for k in xrange(100000):
            m.append(k)
    print "Test 4",time.time()-s

This is 100s of 1000s of ints in the inner loop; test 3 puts them
into a pre-allocated list, test 4 discards the list each time and
lets it grow.

> What if it also allocates
> other small objects so the ints become more fragmented?

This allocator doesn't bother much about fragmentation: it's
constant-time most of the time on allocation, and often on
deallocation (especially when the memory is fragmented).
Also, it's hard to find an object that is as small as an
int; I think a one-element tuple applies:

def t5():
    s = time.time()
    i = 0
    for i in xrange(100):
        m = []
        for k in xrange(100000):
            m.append((k,))
    print "Test 5",time.time()-s

The timings, for the best of three runs:
           Py2.5      +obmalloc-for-int    slowdown
Test 3     1.8s           2.1s              15%
Test 4     3.6s           3.8s               5%
test 5     7.5s           7.5s               0

Regards,
Martin
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to