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? cheers -- http://mail.python.org/mailman/listinfo/python-list