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解决方案:WindowsError: [Error 2]
Aug 28 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
PyQt5利用QPainter绘制各种图形的实例
Oct 19 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
pytorch 修改预训练model实例
Jan 18 Python
python json.dumps() json.dump()的区别详解
Jul 14 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
图文详解matlab原始处理图像几何变换
Jul 09 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
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
2007/03/15 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
jQuery 使用手册(六)
2009/09/23 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
13个PHP函数超实用
2015/10/21 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
浅析vue-router原理
2018/10/19 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
外贸业务员求职信范文
2013/12/12 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
自我评价的范文
2014/02/02 职场文书
眼镜促销方案
2014/03/15 职场文书
2014春晚主持词
2014/03/25 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
学校节能减排方案
2014/06/13 职场文书
新兵入伍心得体会
2014/09/04 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
检讨书大全
2015/01/27 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书