Python 中list ,set,dict的大规模查找效率对比详解


Posted in Python onOctober 11, 2019

很多时候我们可能要频繁的进行元素的find 或in操作,本人一直天真的以为python的list做了hash,通过红黑树来高效查找···直到今天我真正来测试它和set,dict的查找效率时,才发现自已想太多了!!!!

先看代码:

__author__ = 'jmh081701'
import numpy
import time
l=[]
sl=set()
dl=dict()
r=numpy.random.randint(0,10000000,100000)
for i in range(0,100000):
  l.append(r[i])
  sl.add(r[i])
  dl.setdefault(r[i],1)
#生成3种数据结构供查找,常规的list,集合sl,字典dl.里面的元素都是随机生成的,为什么要随机生成元素?这是防止某些结构对有序数据的偏向导致测试效果不客观。

start=time.clock()
for i in range(100000):
  t=i in sl
end=time.clock()
print("set:",end-start)
#计算通过set来查找的效率
start=time.clock()
for i in range(100000):
  t=i in dl
end=time.clock()
print("dict:",end-start)
#计算通过dict的效率
start=time.clock()
for i in range(100000):
  t=i in l
end=time.clock()
print("list:",end-start)
#计算通过list的效率

结果:

set: 0.01762632617301519
dict: 0.021149536796960248
······
···
··

呵呵呵呵···list等了20分钟都没出结果。

所以···结果一览无余啊。

查找效率:set>dict>list

单次查询中:看来list 就是O(n)的;而set做了去重,本质应该一颗红黑树(猜测,STL就是红黑树),复杂度O(logn);dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找,其查找复杂其实是O(logn),并不是所谓的O(1)。O(1)只是理想的实现,实际上很多hash的实现是进行了离散化的。dict比set多了一步hash的过程,so 它比set慢,不过差别不大。

so,如果是要频繁的查找,请使用set吧!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 域名分析工具实现代码
Jul 15 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
python实现发送邮件功能
Jul 22 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
python 连续不等式语法糖实例
Apr 15 Python
python怎么调用自己的函数
Jul 01 Python
Python常用GUI框架原理解析汇总
Dec 07 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 #Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 #Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 #Python
Python中的延迟绑定原理详解
Oct 11 #Python
python pycharm的安装及其使用
Oct 11 #Python
详解Python3迁移接口变化采坑记
Oct 11 #Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 #Python
You might like
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
jQuery 技巧小结
2010/04/02 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
详解javascript中的Error对象
2019/04/25 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
基于Python实现天天酷跑功能
2021/01/06 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
Araks官网:纽约内衣品牌
2020/10/15 全球购物
求职信模板标准格式范文
2014/02/23 职场文书
中专生自荐信
2014/06/25 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python