首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象的xrange类型

对象的xrange类型
EN

Stack Overflow用户
提问于 2015-11-04 14:45:42
回答 2查看 465关注 0票数 0

当我读xrange参考的时候,上面写着..。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-11-04 14:52:03

引用https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Use_xrange_instead_of_range

xrange是一个生成器对象,基本上相当于以下Python2.3代码: def ( start,stop=None,step=1):如果stop为None: stop = start =0其他: stop = int(stop) start = int( start ) step = int( step ),start < stop:产生start +=步骤 但它是用纯C实现的。

他们说,inxrange对象上效率很低,因为如果__contains__方法失败,in会尝试迭代对象。来自https://docs.python.org/3/reference/expressions.html#membership-test-details

对于不定义__contains__()但确实定义了__iter__()的类,如果在遍历y时生成了带有x == z的值z,则x in y为真。

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

代码语言:javascript
复制
N in xrange(N + 1)

在逻辑上等同于

代码语言:javascript
复制
for n in xrange(N + 1):
    if n == N:
        break

而且效率不高。

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

注意,用于包含测试的in操作符的性能不影响for循环的性能。这是两个不同的东西。

实际上,"in"循环播放中(如下图所示)

代码语言:javascript
复制
for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

是固定的而不是操作员。

票数 1
EN

Stack Overflow用户

发布于 2015-11-04 14:49:06

不,他们的意思是

代码语言:javascript
复制
>>> 5 in xrange(0, 10)
True

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

它不是关于for循环的,它是正确和有效的。我想这医生有点误导人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33524742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档