[Python-Dev] Comparison speed

Greg Ball gball at cfa.harvard.edu
Thu May 17 19:18:10 EDT 2001


The timbot wrote:
> Random clue: when you're too lazy to try to subtact out loop overhead
> (not a knock, I am too), you may have better luck with
> 
>     r = [1] * 1000000
> 
> than
> 
>     r = range(1000000)
> 

This provoked me into trying my hand at a C extension.
Using CVS python, I made a new iterator that returns None some
number of times before quitting.

>>> import nones
>>> nones.new(5)
<iterator object at 0x80cfe20>
>>> for o in nones.new(5): print o
... 
None
None
None
None
None

So then I compared it to various other approaches.

>>> def loop(seq):
...     from time import clock  
...     start = clock()
...     for o in seq: pass
...     print clock()-start 
... 
>>> loop(xrange(1000000))
0.53
>>> loop(xrange(1)*1000000) 
0.52
>>> loop(range(1000000))
0.5
>>> loop(range(1)*1000000)  # same as [1]*1000000
0.43
>>> loop(nones.new(1000000)) 
0.38
>>> loop(nones.new(100000000))
38.35
>>> import sys
>>> loop(nones.new(sys.maxint)) # Not a 64 bit machine, obviously
801.52

Finally I noticed that by running python with -O I save 2 SET_LINENO
instructions per loop.

>>> loop(nones.new(100000000)) # was 38.35
26.51


> there's-as-an-art-to-doing-nothing-quickly-ly y'rs  - tim

I can now do nothing 3772000 times per second in python.  But is it really
art?

--
Greg Ball





More information about the Python-list mailing list