[Python-Dev] collections module

Guido van Rossum guido at python.org
Tue Jan 13 12:14:22 EST 2004


> [Guido]
> > Just in case nobody had thought of it before, couldn't the realloc()
> > call be avoided when roundupsize(oldsize) == roundupsize(newsize)???

[Tim]
> Followup:  it's not quite that easy, because (at least) PyList_New(int size)
> can create a list whose allocated size hasn't been rounded up.
> 
> If I "fix" that, then it's possible to get away with just one roundupsize()
> call on most list.insert() calls (including list.append()), while avoiding
> the realloc() call too.  Patch attached.
> 
> I timed it like so:
> 
> def punchit():
>     from time import clock as now
>     a = []
>     push = a.append
>     start = now()
>     for i in xrange(1000000):
>         push(i)
>     finish = now()
>     return finish - start
> 
> for i in range(10):
>     print punchit()
> 
> and got these elapsed times (this is Windows, so this is elapsed wall-clock
> time):
> 
>        before           after
> -------------  --------------
> 1.05227710823  1.02203188119
> 1.05532442716  0.569660068053
> 1.05461539751  0.568627533147
> 1.0564449622   0.569336562799
> 1.05964146231  0.573247959235
> 1.05679528655  0.568503494862
> 1.05569402772  0.569745553898
> 1.05383177727  0.569499991619
> 1.05528000805  0.569163914916
> 1.05636618113  0.570356526258
> 
> So pretty consistent here, apart from the glitch on the first "after" run,
> and about an 80% speedup.
> 
> Yawn <wink>.
> 
> If someone wants to run with this, be my guest.  There may be other holes
> (c.f. PyList_New above), and it could sure use a comment about why it's
> correct (if it in fact is <0.9 wink>).

Awesome!  We need timing results on some other platforms (Linux,
FreeBSD, MacOSX).

Volunteers?

--Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list