为什么在Python 3 1000000000000001中“100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我的理解是,该函数实际上是Python 3中的对象类型,它动态生成其内容,类似于生成器。range()
在这种情况下,我本来以为以下行会花费过多的时间,因为为了确定1千万亿是否在该范围内,必须生成一个千万亿的值:
1_000_000_000_000_000 in range(1_000_000_000_000_001)
此外:似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的)。
我也尝试过这样的事情,但计算仍然几乎是即时的:
# count by tens
1_000_000_000_000_000_000_000 in range(0,1_000_000_000_000_000_000_001,10)
如果我尝试实现自己的范围函数,结果就不那么好了!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
物体在引擎盖下做了什么,使它如此之快?range()
Martijn Pieters的答案因其完整性而被选中,但也参见abarnert的第一个答案,以很好地讨论Python 3中成为一个成熟的序列意味着什么,以及一些关于Python实现中函数优化的潜在不一致的信息/警告。abarnert的另一个答案更详细地介绍了一些细节,并为那些对Python 3中优化背后的历史(以及Python 2中缺乏优化)感兴趣的人提供了链接。通过poke和wim的答案为那些感兴趣的人提供了相关的C源代码和解释。range
__contains__
xrange