栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在Python 3中“范围(10000000000000001)”这么快?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在Python 3中“范围(10000000000000001)”这么快?

Python 3 range()对象不会立即产生数字。它是一个智能序列对象,可按需生成数字。它包含的只是你的开始,结束和步进值,然后在对对象进行迭代时,每次迭代都会计算下一个整数。

该对象还实现了

object.__contains__hook
,并计算你的电话号码是否在其范围内。计算是一个(近)恒定时间运算
*
。永远不需要扫描范围内所有可能的整数。

range()
对象文档中:

所述的优点

range
类型通过常规
list
tuple
是一个范围对象将始终以相同的内存(小)数量,无论它代表的范围内的大小(因为它仅存储
start
stop
step
值,计算各个项目和子范围如所须)。

因此,你的

range()
对象至少可以做到:

class my_range(object):    def __init__(self, start, stop=None, step=1):        if stop is None: start, stop = 0, start        self.start, self.stop, self.step = start, stop, step        if step < 0: lo, hi, step = stop, start, -step        else: lo, hi = start, stop        self.length = 0 if lo > hi else ((hi - lo - 1) // step) + 1    def __iter__(self):        current = self.start        if self.step < 0: while current > self.stop:     yield current     current += self.step        else: while current < self.stop:     yield current     current += self.step    def __len__(self):        return self.length    def __getitem__(self, i):        if i < 0: i += self.length        if 0 <= i < self.length: return self.start + i * self.step        raise IndexError('Index out of range: {}'.format(i))    def __contains__(self, num):        if self.step < 0: if not (self.stop < num <= self.start):     return False        else: if not (self.start <= num < self.stop):     return False        return (num - self.start) % self.step == 0

这仍然缺少实际

range()
支持的几项内容(例如
.index()
.count()
方法,哈希,相等性测试或切片),但应该可以给你一个提示。

我还简化了

__contains__
实现,只专注于整数测试。如果你为实物
range()
提供非整数值(包括的子类
int
),则会启动慢速扫描以查看是否存在匹配项,就好像你对所有包含的值列表使用了包含测试一样。这样做是为了继续支持其他数字类型,这些数字类型恰好支持整数的相等性测试,但也不希望也支持整数算术。请参阅实现收容测试的原始Python问题。

  • 由于Python整数是无界的,所以时间接近恒定,因此数学运算也随着N的增长而及时增长,这使其成为O(log N)运算。由于所有操作均以优化的C代码执行,并且Python将整数值存储在30位块中,因此,由于此处涉及的整数大小,在看到任何性能影响之前,你将耗尽内存。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号