其实之前一直在使用这两个函数,但是至于究竟有什么区别也不是很清楚,因为平时用到的无非就是生成列表循环遍历这样的任务,所以就没有花时间去研究一下这个,今天看到一个题目考的就是二者的区别,索性就停下脚步,看看究竟有什么区别吧。
也在网上查了一些资料,明天了二者的区别本质上就是:内存的使用差别
range在我平时的工作中使用的更为频繁一点,自然更了解一下,使用最简单的range函数可以产生一个列表用于后续的处理,但是xrange返回的并不是一个列表,而是一个迭代器,这样做的好处就是节省了内存空间,试想一下如果我需要数以亿计的数字,那么单纯内存空间的消耗就是巨大的,而xrange采用迭代器的方法配合for循环的遍历效果等同于range的效果,这样你使用的时候是感觉不到任何的差别的。当然,节省了内存空间的确是xrange的一个优点但是缺点就是:生成的对象是迭代形式的,这样如果我们想要的记过是列表的话就不行了,这里有一个办法就是可以使用list方法直接将迭代器转化为列表的形式,不过个人建议是:如果平时的处理的数据量没有那么大,返回的结果又必须是列表形式的那么就直接使用range就行了,如果数据量很大,只是用于遍历循环这样的处理操作的话就直接使用xrange好了,下面给出来一个简单的测试使用的样例,用法都很简单,主要是关注与性能的差别,这也是二者的本质区别所在:
#!usr/bin/env python
#encoding:utf-8
'''
__Author__:沂水寒城
功能:python range与xrange的区别
'''
import time
import math
def test_func(num):
'''
'''
print '**************************************range******************************************'
one=range(num)
print 'range(num) is:', one
print 'type(range(num)) is:', type(one)
for i in one:
print i
print '**************************************xrange******************************************'
two=xrange(num)
print 'xrange(num) is:', two
print 'type(xrange(num)) is:', type(two)
for j in two:
print j
print '----------------------------------------时间消耗对比---------------------------------------'
new=int(math.pow(num,7))
start_time=time.time()
one=range(new)
end_time=time.time()
two=xrange(new)
end_time2=time.time()
print 'range耗时为:', end_time-start_time
print 'xrange耗时为:', end_time2-end_time
def simple_usage():
'''
range的用法很简单,下面是我经常用到的几种方法
range(a,b,c)中,a、b、c分别代表了起始、终止位置和步长
'''
print range(10)
print range(1,10,2)
print range(0,10,2)
print range(5,9)
print range(10,-1,-1)
print range(100,10,-10)
if __name__ == '__main__':
simple_usage()
print '--------------------------------------------------------------------------------------------'
test_func(10)
结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 3, 5, 7, 9]
[0, 2, 4, 6, 8]
[5, 6, 7, 8]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[100, 90, 80, 70, 60, 50, 40, 30, 20]
--------------------------------------------------------------------------------------------
**************************************range******************************************
range(num) is: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
type(range(num)) is: <type 'list'>
0
1
2
3
4
5
6
7
8
9
**************************************xrange******************************************
xrange(num) is: xrange(10)
type(xrange(num)) is: <type 'xrange'>
0
1
2
3
4
5
6
7
8
9
----------------------------------------时间消耗对比---------------------------------------
range耗时为: 10.971503973
xrange耗时为: 1.31130218506e-05
--------------------------------------时间消耗对比-----------------------------------------------
range耗时为: 0.0350050926208
xrange耗时为: 8.10623168945e-06
从结果中可以看到:在数据量为百万级别的时候二者的差距已经是非常之大了,这里不考虑内存的消耗,从侧面看时间的消耗,正因为range是完整的开辟出来了一块完整的内存空间来产生结果数据的列表所以很耗时,而xrange只是产生了一个迭代器并没有开辟出这样的一块内存地址也没有产生这样的一个完整的结果数据的列表,所以速度很快,但是不可以单纯因为时间消耗的多少以及内存消耗的多少来评判其性能的优异,因为适用的场合以及你使用的场合和方法都是很重要的。