最佳答案
我的理解是range()
函数,实际上是Python 3中的对象类型,动态生成其内容,类似于生成器。
在这种情况下,我预计以下行将花费过多的时间,因为为了确定1000万亿是否在范围内,必须生成千万亿个值:
1_000_000_000_000_000 in range(1_000_000_000_000_001)
此外,似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的)。
我也尝试过这样的事情,但计算仍然几乎是即时的:
# count by tens1_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 = 0while i < N:yield ii += 1return
range()
对象在引擎盖下做什么使它如此之快?
选择Martijn Pieters的回答是因为它的完整性,但也请参阅Abarnert的第一个答案,以更好地讨论range
在Python 3中成为一个成熟的序列意味着什么,以及一些关于__contains__
函数优化在Python实现中潜在不一致的信息/警告。