当我读xrange参考的时候,上面写着..。
类型为xrange的对象类似于缓冲区,因为没有特定的语法来创建它们,但是它们是使用xrange()函数创建的。它们不支持切片、级联或重复,对它们使用in,而不是in,min()或max()是效率低下的。
但是,只要我见过,我使用的所有xrange()都与in一起使用。像for x in xrange(10): do somethings..。
那么,为什么说这种方式效率低下呢?那么,使用xrange的正确方式应该是什么呢?
发布于 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实现的。
他们说,in在xrange对象上效率很低,因为如果__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次迭代
N in xrange(N + 1)在逻辑上等同于
for n in xrange(N + 1):
if n == N:
break而且效率不高。
not in效率低下,因为in效率低下。
注意,用于包含测试的in操作符的性能不影响for循环的性能。这是两个不同的东西。
实际上,"in"在循环播放中(如下图所示)
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]是固定的而不是操作员。
发布于 2015-11-04 14:49:06
不,他们的意思是
>>> 5 in xrange(0, 10)
True这是对“包含”的测试。它效率低下,因为在最坏的情况下,它必须遍历所有的元素。
它不是关于for循环的,它是正确和有效的。我想这医生有点误导人。
https://stackoverflow.com/questions/33524742
复制相似问题