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实现的防DDoS脚本
Feb 08 Python
跟老齐学Python之开始真正编程
Sep 12 Python
python实现中文输出的两种方法
May 09 Python
python实现日常记账本小程序
Mar 10 Python
详解pandas的外部数据导入与常用方法
May 01 Python
python简单验证码识别的实现方法
May 10 Python
给我一面国旗 python帮你实现
Sep 30 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
Pytest allure 命令行参数的使用
Apr 18 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 观察者模式的实现代码
2013/05/10 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
jquery foreach使用示例
2013/09/12 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
python爬取网页转换为PDF文件
2018/06/07 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python实现证件照换底功能
2019/08/20 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
测绘工程个人的自我评价
2013/11/10 职场文书
本科毕业生的求职信范文
2013/11/20 职场文书
师德师风演讲稿
2014/05/05 职场文书
导师就业推荐信范文
2014/05/22 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
诚信考试主题班会
2015/08/17 职场文书
听课评课活动心得体会
2016/01/15 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫