0

当我阅读xrange 参考时,它是这样说的..

xrange 类型的对象类似于缓冲区,因为没有特定的语法来创建它们,但它们是使用 xrange() 函数创建的。它们不支持切片、连接或重复,并且在它们上使用 in、not in、min() 或 max() 效率低下。

但是,只要我见过,我用过的所有 xrange() 都是用 in.like for x in xrange(10): do somethings..

那么为什么它说这种方式效率低下呢?那么使用 xrange 的正确方法应该是什么?

4

2 回答 2

1

报价性能提示

xrange是一个生成器对象,基本上相当于下面的 Python 2.3 代码:

def xrange(start, stop=None, step=1):
    if stop is None:
        stop = start
        start = 0
    else:
        stop = int(stop)
    start = int(start)
    step = int(step)

    while start < stop:
        yield start
        start += step

除了它是用纯C实现的。

他们说这inxrange对象效率低下,因为如果方法失败,它会in尝试迭代对象。__contains__会员测试详细信息

对于没有定义__contains__()但确实定义 的类,如果在迭代时产生了一些值__iter__(),则为真。x in yzx == zy

xrange没有实现__contains__,为了在xrange(N + 1) in运算符中“找到”元素 N 必须执行 N 次迭代,所以

N in xrange(N + 1)

逻辑上等价于

for n in xrange(N + 1):
    if n == N:
        break

而且效率不高。

not in效率低下,因为in效率低下。

请注意,包含测试in的操作员的性能不会影响循环的性能。这是2个不同的东西。for

其实"in"语法规则中为for循环(如下图)

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

是固定的,不是操作员。

于 2015-11-04T14:52:03.033 回答
0

不,他们真正的意思是

>>> 5 in xrange(0, 10)
True

这是对“包含”的测试。这是低效的,因为在最坏的情况下它必须遍历所有元素。

for与正确和有效的循环无关。我想该文档有点误导。

于 2015-11-04T14:49:06.043 回答