千家信息网

Python执行x in range(y)的速度能有多快

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要介绍了Python执行x in range(y)的速度能有多快的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python执行x in range(y)的速度能
千家信息网最后更新 2025年12月02日Python执行x in range(y)的速度能有多快

这篇文章主要介绍了Python执行x in range(y)的速度能有多快的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python执行x in range(y)的速度能有多快文章都会有所收获,下面我们一起来看看吧。

题图:unsplash.com

在 Python 中,表达式 1000000000000000 in range(1000000000000001) 的执行速度能有多快?

判断一个元素 x 是否存在于集合 y 中最简单粗暴地方法就是迭代,每次取出一个值与之比较,如果集合中存在一个值 z 等于 x就返回 true ,它的时间复杂度是 O(n),使用哈希算法的理论时间复杂度是 O(1),二分查找的时间复杂度是 O(log n),那么 Python 究竟会采用的哪种算法来实现呢?

先来做个实验:


#python2

timeit.timeit('1000000000 in range(0,1000000000,10)', number=1)
5.50357640805305

timeit.timeit('1000000000 in xrange(0,1000000000,10)', number=1)
2.3025200839183526

# python3

import timeit
timeit.timeit('1000000000 in range(0,1000000000,10)', number=1)
4.490355838248402e-06

我们都知道 python2 中的 range 函数返回的是一个列表对象,一次性把所有的元素加载到内存,所以执行第一个表达式的时候,系统会突然感觉非常卡顿,它需要的时间是5秒多。

xrange 和 python3 中的 range 函数类似,都是返回一个迭代器对象,但是它俩的执行结果相差悬殊,让人大跌眼镜。第三个表达式所花的时间接近0秒,为何 python2 的 xrange 与 python3 中 range 函数区别这么大?为了弄明白其中的玄机,我们要理解in操作是如何执行的。根据 Python 文档 in 的规则:

  • 如果该类实现了__contains__()方法,那么只要 y.__contains__(x) 返回 true 那么 x in y 也返回 true,反之亦然。

  • 没有实现__contains__()方法,但实现了__iter__()方法,那么在迭代过程中如果有某个值 z==x,就返回 true,否则就是 false。

  • 如果以上两个方法都没有实现,就看__getitem__()方法, 如果存在一个索引i使得 x==y[i] ,就返回 true,否则返回 false。

明白了 in 的规则之后,我们先看看 xrange 提供了哪些方法:

dir(xrange)

['__class__','__getitem__', '__hash__', '__init__',
'__iter__', '__len__', '__new__', ...]

是的,xrange 函数只实现了 __getitem____iter__,判断 x 是 是否在 y 中需要逐个值迭代进行比较,也就是说 xrange 的时间复杂度是O(n)。

再来看看 python3 的 range 有哪些方法:

 dir(range)
['__class__', '__contains__', '__getitem__', '__iter__',
'count', 'index', 'start', 'step', 'stop', ...]

range 提供的属性比 xrange 要多很多,不仅实现了 __getitem____iter__ ,还实现了 __contains__ ,所以它会优先调用__contains__方法,此外,它还提供了三个属性 start、stop、step。那么究竟为什么它的执行速度会如此之快呢?来看看contains方法是如何实现的吧。

在 Python3 中,__contains__ 并不是逐个值迭代对比,而是采用这样一种逻辑:

  • 首先检查 x 是否 在 start 和 stop 范围之间:start <= x < stop

  • 如果在这个区间范围,那么再根据 step 计算 x 是否刚好落在 xrange 区间中的某个值上,这里用取模的方式来判断:(x - start) % step == 0

此刻真相大白,xrange 的时间复杂度是O(1),也就是说不管 xrange(start, stop, step) 中的 stop 值多大,时间复杂度都是一个常量。所以 python3 中的 range 方法不仅可以节省内存,而且执行效率更高,所以不要再纠结学 Python2 还是 Python3 了。

也可以把它当作一到面试题来问:Python2 中的 xrange 与 python3 中的 range 有什么区别?它不仅可以考察候选者对 Python3 的熟悉程度,而且可以看出候选者对一个知识点的理解深度。

关于"Python执行x in range(y)的速度能有多快"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Python执行x in range(y)的速度能有多快"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

方法 时间 速度 复杂 复杂度 迭代 函数 知识 表达式 三个 也就是 也就是说 候选者 元素 内存 内容 区间 对象 就是 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 方舟服务器管理器怎么导入存档 我的世界服务器箱子指令 网络技术安全员证 应急管理网络安全保障工作方案 jsp数据库代码怎么写 明光自动化软件开发技术选择 广义网络安全包括哪些 网络安全责任书是什么 铁门赛克软件开发有限公司 黑客及其网络安全 网络技术与应用的学科核心与素养 2017浙江三级网络技术 网络安全公开课线上薛建国 老主板组装文件存储服务器 易赛诺青岛网络技术面试 农村家庭能源消费数据库 衢州ipfs集群式服务器 数据库查询分析器绿色官方版 华为服务器买回来有系统吗 网络安全画报简单漂亮 张家口网络技术哪个好 百度云mysql数据库 淮安云主机服务器价格 国家信息网络安全局保密协议 数据库报表页码设置 2021年网络安全授课 黄冈师范学院网络技术挑战赛 基础软件开发行业代码 安徽九运软件开发公司电话 访问文件服务器显示文件夹不完整
0