I'm missing something here with range vs. xrange

Chris Mellon arkanes at gmail.com
Fri Dec 7 17:08:46 EST 2007


On Dec 7, 2007 3:08 PM, Joe Goldthwaite <joe at goldthwaites.com> wrote:
> Here's the simple benchmark;
>
> start = time.time()
> for x in xrange(3):
>         for y in xrange(10000000):
>                 pass
> print 'xRange %s' % (time.time() - start)
>
> start = time.time()
> for x in range(3):
>         for y in range(10000000):
>                 pass
> print 'Range %s' % (time.time() - start)
>
> Here's what I get;
>
> xRange 92.5529999733
> Range 95.2669999599
>
> Not a lot of difference.  Range is slower but not by much. I know that range
> builds
> a list then iterates through it. I thought that xrange just kept a counter
> that was
> incremented and returned with each call. No list was ever created. If that's
> true
> (and I guess it's not), xrange would be much faster than range. It seems
> almost
> identical. Given the amount of performance difference, I don't see why
> xrange even
> exists.
>

You can't imagine why someone might prefer an iterative solution over
a greedy one? Depending on the conditions, the cost of creating the
list can be a greater or a lesser part of the total time spent. Actual
iteration is essentially the same cost for both. Try looking at memory
usage while you're running these tests.

Here's my test results:
C:\>python -m timeit "for x in range(10000000):pass"
10 loops, best of 3: 593 msec per loop

Memory usage (extremely rough, only for comparison purposes: 163 MB

C:\>python -m timeit "for x in xrange(10000000):pass"
10 loops, best of 3: 320 msec per loop

Memory usage: just under 4MB

You mentioned psyco in your original post, which has specific
optimizations for range - I believe it allocates the entire list as an
empty memory block, and then creates the integer objects yielded from
the range lazily.

C:\>python -m timeit "range(10000000)"
10 loops, best of 3: 299 msec per loop

C:\>python -m timeit -s "import psyco;psyco.full()" "range(10000000)"
10 loops, best of 3: 0.0376 usec per loop



More information about the Python-list mailing list