1

我正在阅读有关 Python 的教程,它说“有一个变体 xrange() 可以避免为性能敏感的情况构建整个列表的成本(在 Python 3000 中,range() 将具有良好的性能行为,你可以忘记关于 xrange())。” 来源

我问的是 Python 2.x 而不是 Python 3。

我不确定这意味着什么。我是否理解range(a, b)创建从ato的所有值的列表b然后对其进行迭代,而xrange(a, b)仅在迭代时创建每个值?如果是这种情况,那么只有在代码实际上没有遍历整个列表并提前中断时,性能才会得到提高。

有人可以对此发表评论吗?

4

2 回答 2

2

你理解正确。

区别在于内存:当使用range()整个列表时,将在内存中分配,而xrange()返回一个生成器(实际上它返回一个充当生成器的 xrange 对象)

Python 的文档在这个xrange()主题上非常清楚:

xrange() 相对于 range() 的优势是最小的(因为 xrange() 在被要求时仍然必须创建值),除非在内存不足的机器上使用非常大的范围或当范围的所有元素都是没用过

于 2018-08-16T19:58:15.907 回答
1

在 python3 中,range()不会一次生成整个序列,因此它也很高效:

范围类型优于常规列表或元组的优点是范围对象将始终占用相同(少量)的内存,无论它表示的范围大小(因为它只存储开始、停止和步长值,根据需要计算单个项目和子范围)。

文档

于 2019-04-11T11:31:29.010 回答