Python学习入门(32)——xrange/range
在
Python
中
range
和
xrange
是不同的,两者的区别是微妙的。为了简单起见,这里省略两个函数的可选参数
start
和
step
。
range
返回值和想象的一样:一个从
0
开始指定长度的连续整数序列。然而,
xrange
返回一个
"xrange
对象
"
,该对象非常类似于迭代器。如果你曾经研究过迭代器,则两者的区别就很明显。
下面是个例子:
range(1000000)
xrange(1000000)
range(1000000)
会返回一个
100
万的整数元素的序列,而
xrange(1000000)在
本质上
会返回一个迭代序列。显然
xrange
支持迭代,而
range
不支持。这种收益是很小的,因为
"
当需要元素的时候,
xrange
仍然要创建它们
"
。但是无论需要的序列多大,每次遍历时
xrange
消耗相同量的内存。在遍历极端的大序列时,这是相对于
range
的很大优势。另一个优势也是明显的:当你的代码在遍历已经产生的序列时调用
break
的话,
xrange
显然比
range
要好,因为
xrange
会消耗更少的内存。
这两个基本上都是在循环的时候用。
for
i
in
range
(
0
,
100
)
:
print
i
for
i
in
xrange
(
0
,
100
)
:
print
i
这两个输出的结果都是一样的,实际上有很多不同,
range
会直接生成一个
list
对象:
a =
range
(
0
,
100
)
print
type
(
a
)
print
a
print
a
[
0
]
, a
[
1
]
而
xrange
则不会直接生成一个
list
,而是每次调用返回其中的一个值
a =
xrange
(
0
,
100
)
print
type
(
a
)
print
a
print
a
[
0
]
, a
[
1
]
示例:
t1 = range(0, 100) print type(t1) # <type 'list'> print t1[0],t1[1],t1[99] # 0 1 99 print t1 # [0, 1, 2, 3, 4, 5, 6, ..., 99] t2 = xrange(0, 100) print type(t2) # <type 'xrange'> print t2[0],t2[1],t2[99] # 0 1 99 print t2 # xrange(100)
性能比较:
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' @author: homer @see: ithomer.net ''' import time def test_range(num): for i in range(0, num): #print i pass def test_xrange(num): for i in xrange(0, num): #print i pass NUM = 100000000 # test range start = time.time() test_range(NUM) print("test_range() costTime: " + str(time.time() - start)) # test xrange start = time.time() test_xrange(NUM) print("test_xrange() costTime: " + str(time.time() - start))
运行结果:
NUM = 100000000
test_range() costTime: 18.8114709854
test_xrange() costTime: 1.08277893066
NUM = 1000000
test_range() costTime: 0.0496039390564
test_xrange() costTime: 0.0162799358368
NUM = 10000
test_range() costTime: 0.000231027603149
test_xrange() costTime: 0.000118970870972
所以
xrange
做循环的性能比
range
好,尤其是返回很大的时候!
尽量用
xrange
吧,除非你是要返回一个列表。
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2013-12-21 22:25:41
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!