Python 学习入门(32)—— xrange/range

Pythonrangexrange是不同的,两者的区别是微妙的。为了简单起见,这里省略两个函数的可选参数startsteprange返回值和想象的一样:一个从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(0100):

print i

 

for i in xrange(0100):

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吧,除非你是要返回一个列表。


`xrange`和`range`都是Python中用来生成一系列数字序列的方法,它们在早期版本的Python(如Python 2)中存在,但到了Python 3,`xrange`被弃用,只保留了`range`。 **range()**: - 在Python 3中,`range()`是内置函数,用于生成一个整数序列。它可以接受一个或三个参数: - 如果只有一个参数,它将生成从0开始,直到指定值但不包括该值的序列。 - 如果有两个参数,第一个是开始值,第二个是结束值,生成的序列是从开始值到结束值(但不包括结束值)。 - 如果提供三个参数,第一个是开始值,第二个是结束值,第三个是步长,生成的序列将按照这个步长递增。 ```python # Python 3 示例 for i in range(5): # 生成 [0, 1, 2, 3, 4] print(i) for i in range(1, 7, 2): # 生成 [1, 3, 5] print(i) ``` **xrange()(仅Python 2)**: - 在Python 2中,`xrange()`也生成一个整数序列,但它是一个惰性计算的迭代器,即它不会一次性创建整个序列,而是每次请求下一个元素时才计算。这使得内存占用更小,适用于处理大量数据的情况,尤其是在处理大型范围时。 ```python # Python 2 示例 (xrange相当于Python 3的range) for i in xrange(5): print(i) # 这里实际上逐个生成并打印 [0, 1, 2, 3, 4] # 注意,Python 2中的 range() 是一个列表,会一次性生成所有元素 # for i in range(5): # 这会导致一次性生成 [0, 1, 2, 3, 4],可能会消耗较大内存 ``` 在Python 3中,`range()`的行为已经足够高效,因此`xrange()`不再必要,推荐直接使用`range()`。不过,如果确实需要节省内存并且在Python 2环境中工作,`range()`和`xrange()`的行为相似,可以根据需求选择。在Python 3以后的版本中,`xrange`已经不存在,`range`成为了唯一的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值