您的位置:首页 > 编程语言 > Python开发

Difference between Range and Xrange in Python

2015-11-18 15:13 627 查看

概述

之前在stackoverflow上看见一个答案描述Python中range与xrange的区别:

range的返回值是一个list,包含所有范围内满足条件的元素;


而Xrange的返回值是一个xrange的Object,通过协程,在每次调用时运行一次生成下一个元素的对象。


(在文档中可以找到类似的表述)

也就是说range是一次生成所有元素并返回list,而xrange是在每次调用时生成一个;换言之,xrange对内存会更加友好。

举一个栗子

在了解这个答案后我的印象中一直认为xrange貌似要比range好一点,不过一直没有一个直观的印象。

直到最近尝试做ProjectEuler的一个题:Highly divisible triangular number

无脑地直接写了一个暴力的解法:

triangular = 0
triangular_step = 0

def triangular_num():
global triangular_step, triangular
# make step add 1, and figure out triangular num
triangular_step += 1
triangular += triangular_step

def divisor_num(digit):
num = 0
for tmp in range(1, digit + 1):
if digit % tmp == 0:
num += 1
return num

if __name__ == "__main__":
while True:
triangular_num()
dn = divisor_num(triangular)
with open('./out.txt', 'a') as f:
f.write(str(triangular) + ' : ' + str(dn) + '\n')
if dn > 500:
break


运行时发现内存的使用量高达几百,并且很稳定地向上增长:



之后我将range改为xrange:



内存由此稳定在3.5M左右。

注与吐槽

说明一下,笔者使用的Python是2.7的版本,在Python3中range的功能已由xrange替换,所以你可以放心大胆地用range而不用担心内存的问题。

吐槽:

笔者也想用Python3,python3中很多特性都非常好,不过无奈更新太频繁,很多组件都不支持。

学习中的一点小体会,写出来与大家分享一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: