当我阅读xrange 参考时,它是这样说的..
xrange 类型的对象类似于缓冲区,因为没有特定的语法来创建它们,但它们是使用 xrange() 函数创建的。它们不支持切片、连接或重复,并且在它们上使用 in、not in、min() 或 max() 效率低下。
但是,只要我见过,我用过的所有 xrange() 都是用 in.like for x in xrange(10): do somethings..
那么为什么它说这种方式效率低下呢?那么使用 xrange 的正确方法应该是什么?
报价性能提示:
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对象效率低下,因为如果方法失败,它会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]
是固定的,不是操作员。
不,他们真正的意思是
>>> 5 in xrange(0, 10)
True
这是对“包含”的测试。这是低效的,因为在最坏的情况下它必须遍历所有元素。
这for与正确和有效的循环无关。我想该文档有点误导。