我的理解是,range()函数实际上是Python 3中的对象类型,它动态地生成它的内容,类似于生成器。
在这种情况下,我希望下面这一行会花费过多的时间,因为为了确定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
returnrange()对象在引擎盖下做什么使它如此快速?
之所以选择Martijn Pieters的回答是因为它的完整性,但也请参阅艾伯纳特的第一个答案,以便很好地讨论在Python3中range是一个完整的序列意味着什么,以及关于__contains__函数在整个__contains__实现中可能存在的不一致性的一些信息/警告。艾伯纳特的另一个答案详细介绍了一些细节,并为那些对Python3中的优化背后的历史感兴趣的人提供了链接(以及缺少对Python2中xrange的优化)。答案被戳和韦姆为感兴趣的人提供了相关的C源代码和解释。
发布于 2019-11-25 17:50:16
4 <= 997 < 1000, and (997 - 4) % 3 == 0.https://stackoverflow.com/questions/30081275
复制相似问题