当我正在阅读xrange reference时,它会这样说..
xrange类型的对象与缓冲区类似,因为没有特定的语法来创建它们,但它们是使用xrange()函数创建的。它们不支持切片,连接或重复,并且在它们中使用in而不是min()或max()是低效的。
但是,只要我见过,我使用过的所有xrange()都在中。就像for x in xrange(10): do somethings
..
那么为什么说这种方式效率低下呢?那么应该使用xrange的正确方法呢?
答案 0 :(得分: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实现的。
他们说in
在xrange
个对象上效率低下,因为如果__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
循环。我认为该文档有点误导。