question about xrange performance

MRAB google at mrabarnett.plus.com
Fri Apr 17 14:59:08 EDT 2009


_wolf wrote:
> lately i realized a slow running portion of my application, and a
> quick profiling nourished the suspicion that, of all things, calls to
> `xrange().__contains__` (`x in b` where `b = xrange(L,H)`) is the
> culprit. to avoid any other influences, i wrote this test script with
> class `xxrange` being a poor man’s `xrange` replacement:
> 
> 
> ########################################################
> class xxrange( object ):
>   def __init__( self, start, stop ):
>     self.start  = start
>     self.stop   = stop
>   def __contains__( self, x ):
>     return ( x == int( x ) ) and self.start <= x < self.stop
> 
> import cProfile
> from random import randint
> test_integers = [ randint 0, 5000 ) for i in xrange( 8000 ) ]
> test_range_a  = xxrange( 10000, 20000 )
> test_range_b  = xrange(  10000, 20000 )
> 
> def a():
>   print test_range_a.__class__.__name__
>   for x in test_integers:
>     x in test_range_a
> 
> def b():
>   print test_range_b.__class__.__name__
>   for x in test_integers:
>     x in test_range_b
> 
> cProfile.run('a()')
> cProfile.run('b()')
> ########################################################
> 
> now this is the output, surprise:
> 
> ########################################################
> xxrange
>          8003 function calls in 0.026 CPU seconds
> 
>    Ordered by: standard name
> 
>    ncalls  tottime  percall  cumtime  percall filename:lineno
> (function)
>         1    0.000    0.000    0.026    0.026 <string>:1(<module>)
>         1    0.012    0.012    0.026    0.026 xrange-profiler.py:18(a)
>      8000    0.014    0.000    0.014    0.000 xrange-profiler.py:9
> (__contains__)
>         1    0.000    0.000    0.000    0.000 {method 'disable' of
> '_lsprof.Profiler' objects}
> 
> 
> xrange
>          3 function calls in 4.675 CPU seconds
> 
>    Ordered by: standard name
> 
>    ncalls  tottime  percall  cumtime  percall filename:lineno
> (function)
>         1    0.000    0.000    4.675    4.675 <string>:1(<module>)
>         1    4.675    4.675    4.675    4.675 xrange-profiler.py:23(b)
>         1    0.000    0.000    0.000    0.000 {method 'disable' of
> '_lsprof.Profiler' objects}
> ########################################################
> 
> can it be that a simple diy-class outperforms a python built-in by a
> factor of 180? is there something i have done the wrong way?
> omissions, oversights? do other people get similar figures?
> 
xrange() returns an xrange object, which generates its values on demand.
It doesn't have a __contains__ method, so 'in' uses its iterator, making
the xrange object yield each value until either the desired value is
produced or there are no more values.



More information about the Python-list mailing list