currently, testing for "x in xrange(y)" is an O(n) operation.<br><br>since xrange objects (which would become range in py3k) are not real lists,<br>there's no reason that __contains__ be an O(n). it can easily be made into
<br>an O(1) operation. here's a demo code (it should be trivial to implement<br>this in CPython)<br><br><br>class xxrange(object):<br> def __init__(self, *args):<br> if len(args) == 1:<br> self.start
, self.stop, self.step = (0, args[0], 1)<br> elif len(args) == 2:<br> self.start, self.stop, self.step = (args[0], args[1], 1)<br> elif len(args) == 3:<br> self.start, self.stop, self.step
= args<br> else:<br> raise TypeError("invalid number of args")<br> <br> def __iter__(self):<br> i = self.start<br> while i < self.stop:<br> yield i<br> i +=
self.step<br> <br> def __contains__(self, num):<br> if num < self.start or num > self.stop:<br> return False<br> return (num - self.start) % self.step == 0<br><br><br>print list(xxrange(7)) # [0, 1, 2, 3, 4, 5, 6]
<br>print list(xxrange(0, 7, 2)) # [0, 2, 4, 6]<br>print list(xxrange(1, 7, 2)) # [1, 3, 5]<br>print 98 in xxrange(100) # True<br>print 98 in xxrange(0, 100, 2) # True<br>print 99 in xxrange(0, 100, 2) # False
<br>print 98 in xxrange(1, 100, 2) # False<br>print 99 in xxrange(1, 100, 2) # True<br><br><br><br>-tomer<br>