显然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()那样创建所有值的列表。
其他回答
range:-range将一次填充所有内容。这意味着范围中的每个数字都将占用内存。
xrange:xrange有点像生成器,当你想要数字的范围,但你不希望它们被存储时,它就会出现在图片中,就像你想使用for loop时一样。
在这个简单的示例中,您将发现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
快乐编码!!
对于范围(..)/xrange(..)的较小参数,差异减小:
$ python -m timeit "for i in xrange(10111):" " for k in range(100):" " pass"
10 loops, best of 3: 59.4 msec per loop
$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" " pass"
10 loops, best of 3: 46.9 msec per loop
在这种情况下,xrange(100)的效率仅提高约20%。
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个生成器,因此它是一个序列对象。
这是正确的,但在Python3中,range()将由Python2xrange()实现。如果您需要实际生成列表,则需要执行以下操作:
list(range(1,100))
xrange只存储范围参数并根据需要生成数字。然而,Python的C实现目前将其args限制为C longs:
xrange(2**32-1, 2**32+1) # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1) # OK --> [4294967295L, 4294967296L]
注意,在Python3.0中只有范围,它的行为类似于2.xxrange,但没有对最小和最大端点的限制。