据我了解,该range()
函数实际上是Python 3中的一种对象类型,它会像生成器一样动态生成其内容。
在这种情况下,我本以为下一行会花费过多的时间,因为要确定1个四舍五入是否在该范围内,必须生成一个四舍五入值:
1000000000000000 in range(1000000000000001)
此外:似乎无论我添加多少个零,计算多少都花费相同的时间(基本上是瞬时的)。
我也尝试过这样的事情,但是计算仍然是即时的:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
如果我尝试实现自己的范围函数,结果将不是很好!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
使range()
物体如此之快的物体在做什么?
选择Martijn Pieters的答案是因为它的完整性,但也看到了abarnert的第一个答案,它很好地讨论了在Python 3中range
成为完整序列的含义,以及一些有关__contains__
跨Python实现的函数优化潜在不一致的信息/警告。。abarnert的其他答案更加详细,并为那些对Python 3优化背后的历史(以及xrange
Python 2中缺乏优化)感兴趣的人提供了链接。poke和wim的答案为感兴趣的人提供了相关的C源代码和说明。
range
是发电机?
xrange
与Python3不同range
吗?
xrange()
对象没有__contains__
方法,因此项目检查必须遍历所有项目。另外,中的其他更改很少range()
,例如它支持切片(再次返回一个range
对象),现在还具有count
和index
方法使其与collections.Sequence
ABC 兼容。
bool
或long
type时,才是这种情况,对于其他对象类型,它将变得疯狂。尝试:100000000000000.0 in range(1000000000000001)