显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
当前回答
这是出于优化的原因。
range()将创建从开始到结束的值列表(示例中为0..20)。这将成为非常大范围的昂贵操作。
另一方面,xrange()更为优化。它只会在需要时(通过xrange序列对象)计算下一个值,不会像range()那样创建所有值的列表。
其他回答
xrange使用迭代器(动态生成值),range返回一个列表。
在Python 2.x中:
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个延迟求值的序列对象。
在Python 3中:
range相当于Python 2的xrange。要获得列表,必须显式使用list(range(…))。xrange不再存在。
在这个简单的示例中,您将发现xrange优于range的优势:
import timeit
t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
pass
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 4.49153590202 seconds
t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
pass
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 7.04547905922 seconds
在xrange的情况下,上面的示例没有反映出任何明显更好的内容。
现在看看下面的例子,与xrange相比,range真的很慢。
import timeit
t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
if i == 10000:
break
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 0.000764846801758 seconds
t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
if i == 10000:
break
t2 = timeit.default_timer()
print "time taken: ", (t2-t1) # 2.78506207466 seconds
使用range,它已经创建了一个从0到100000000的列表(耗时),但xrange是一个生成器,它只根据需要生成数字,也就是说,如果迭代继续的话。
在Python-3中,范围功能的实现与Python-2中的xrange功能的实现相同,而他们在Python-3中取消了xrange
快乐编码!!
根据扫描/打印0-N项的要求,range和xrange的工作原理如下。
range()-在内存中创建一个新列表,并获取整个0到N个项目(总共N+1个)并打印它们。xrange()-创建一个迭代器实例,该实例扫描项目并只将当前遇到的项目保存在内存中,因此始终使用相同的内存量。
如果所需的元素只是在列表的开头,那么它可以节省大量的时间和内存。
python中的xrange()和range()的工作方式与用户类似,但当我们讨论如何使用这两个函数分配内存时,就会出现不同。
当我们使用range()时,我们为它正在生成的所有变量分配内存,因此不建议与要生成的大量变量一起使用。
另一方面,xrange()一次只能生成一个特定的值,并且只能与for循环一起使用,以打印所需的所有值。