首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Python3中"1000000000000000 in range(1000000000000001)“这么快?

为什么在Python3中"1000000000000000 in range(1000000000000001)“这么快?
EN

Stack Overflow用户
提问于 2015-05-06 15:32:43
回答 10查看 327.2K关注 0票数 2.8K

我的理解是,range()函数实际上是Python 3中的对象类型,它动态地生成它的内容,类似于生成器。

在这种情况下,我希望下面这一行会花费过多的时间,因为为了确定1千兆是否在这个范围内,必须生成一个四万亿个值:

代码语言:javascript
复制
1_000_000_000_000_000 in range(1_000_000_000_000_001)

此外:似乎无论我加多少个零,计算多少都需要相同的时间(基本上是瞬时的)。

我也尝试过这样的方法,但计算几乎是即时的:

代码语言:javascript
复制
# count by tens
1_000_000_000_000_000_000_000 in range(0,1_000_000_000_000_000_000_001,10)

如果我尝试实现我自己的范围函数,结果就不那么好了!

代码语言:javascript
复制
def my_crappy_range(N):
    i = 0
    while i < N:
        yield i
        i += 1
    return

range()对象在引擎盖下做什么使它如此快速?

之所以选择Martijn Pieters的回答是因为它的完整性,但也请参阅艾伯纳特的第一个答案,以便很好地讨论在Python3中range是一个完整的序列意味着什么,以及关于__contains__函数在整个__contains__实现中可能存在的不一致性的一些信息/警告。艾伯纳特的另一个答案详细介绍了一些细节,并为那些对Python3中的优化背后的历史感兴趣的人提供了链接(以及缺少对Python2中xrange的优化)。答案被戳韦姆为感兴趣的人提供了相关的C源代码和解释。

EN

Stack Overflow用户

发布于 2019-11-25 17:50:16

  1. 由于优化,很容易将给定的整数与最小和最大范围进行比较。
  2. range ()函数在Python3中速度如此之快的原因在于,这里我们使用数学推理来确定边界,而不是直接迭代range对象。
  3. 所以为了解释这里的逻辑:
  • 检查数字是否介于开始和停止之间。
  • 检查步骤精度值是否超过我们的数字。
  1. 例如,997在(4,1000,3)范围内,因为: 4 <= 997 < 1000, and (997 - 4) % 3 == 0.
票数 6
EN
查看全部 10 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30081275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档