Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should you always favor xrange() over range()?

Why or why not?

like image 378
mbac32768 Avatar asked Sep 25 '08 18:09

mbac32768


People also ask

Is Xrange better than range?

If you want to write code that will run on both Python 2 and Python 3, use range() as the xrange function is deprecated in Python 3. range() is faster if iterating over the same sequence multiple times. xrange() has to reconstruct the integer object every time, but range() will have real integer objects.

Why do we prefer the Xrange object to the range function when we iterate over list indices?

xrange() is more efficient because instead of generating a list of objects, it just generates one object at a time. Instead of 100 integers, and all of their overhead, and the list to put them in, you just have one integer at a time. Faster generation, better memory use, more efficient code.

What is the difference between Range () and Xrange () functions in Python?

range() creates a list, so if you do range(1, 10000000) it creates a list in memory with 9999999 elements. This will become an expensive operation on very large ranges. xrange() is a sequence object that evaluates lazily.

What is Xrange ()?

The xrange() function in Python is used to generate a sequence of numbers, similar to the range() function. However, xrange() is used only in Python 2. x whereas range() is used in Python 3. x.


2 Answers

For performance, especially when you're iterating over a large range, xrange() is usually better. However, there are still a few cases why you might prefer range():

  • In python 3, range() does what xrange() used to do and xrange() does not exist. If you want to write code that will run on both Python 2 and Python 3, you can't use xrange().

  • range() can actually be faster in some cases - eg. if iterating over the same sequence multiple times. xrange() has to reconstruct the integer object every time, but range() will have real integer objects. (It will always perform worse in terms of memory however)

  • xrange() isn't usable in all cases where a real list is needed. For instance, it doesn't support slices, or any list methods.

[Edit] There are a couple of posts mentioning how range() will be upgraded by the 2to3 tool. For the record, here's the output of running the tool on some sample usages of range() and xrange()

RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: ws_comma --- range_test.py (original) +++ range_test.py (refactored) @@ -1,7 +1,7 @@   for x in range(20): -    a=range(20) +    a=list(range(20))      b=list(range(20))      c=[x for x in range(20)]      d=(x for x in range(20)) -    e=xrange(20) +    e=range(20) 

As you can see, when used in a for loop or comprehension, or where already wrapped with list(), range is left unchanged.

like image 137
Brian Avatar answered Sep 20 '22 17:09

Brian


No, they both have their uses:

Use xrange() when iterating, as it saves memory. Say:

for x in xrange(1, one_zillion): 

rather than:

for x in range(1, one_zillion): 

On the other hand, use range() if you actually want a list of numbers.

multiples_of_seven = range(7,100,7) print "Multiples of seven < 100: ", multiples_of_seven 
like image 45
Dan Lenski Avatar answered Sep 17 '22 17:09

Dan Lenski