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的Django框架中包装视图函数
Jul 20 Python
python将ansible配置转为json格式实例代码
May 15 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
使用numba对Python运算加速的方法
Oct 15 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
Django 限制访问频率的思路详解
Dec 24 Python
Python操作Excel把数据分给sheet
May 20 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
python实现无边框进度条的实例代码
Dec 30 Python
python 离散点图画法的实现
Apr 01 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二维数组排序方法(array_multisort usort)
2013/12/25 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
PHP中cookie知识点学习
2018/05/06 PHP
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python比较两个图片相似度的方法
2015/03/13 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
Python解惑之True和False详解
2017/04/24 Python
Python之str操作方法(详解)
2017/06/19 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
python如何保存文本文件
2020/06/07 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
Maison Lab荷兰:名牌Outlet购物
2018/08/10 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
会计工作心得体会
2014/01/13 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
企业党建工作总结2015
2015/05/26 职场文书
行政处罚事先告知书
2015/07/01 职场文书
社区低保工作总结2015
2015/07/23 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python