xrange类型的对象

时间:2015-11-04 14:45:42

标签: python xrange

当我正在阅读xrange reference时,它会这样说..

  

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

但是,只要我见过,我使用过的所有xrange()都在中。就像for x in xrange(10): do somethings ..

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

2 个答案:

答案 0 :(得分:1)

引用Perfomance Tips

  

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个对象上效率低下,因为如果__contains__方法失败,in会尝试迭代对象。来自Membership test details

  

对于未定义__contains__()但定义的类   __iter__()x in y如果z的值为x == z,则为真   迭代y时生成。

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运算符对包含性测试的性能不会影响for循环的性能。这是两件不同的事情。

事实上,grammar rule for the for loop中的"in"(如下所示)

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

是固定的,不是运营商。

答案 1 :(得分:0)

不,他们实际上的意思是

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

这是&#34;包含&#34;的测试。它是低效的,因为它必须在最坏的情况下穿过所有元素。

这不是关于正确有效的for循环。我认为该文档有点误导。