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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
python杀死一个线程的方法
Sep 06 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python类的继承用法示例
Jan 31 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
python中对二维列表中一维列表的调用方法
Jun 07 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/06/27 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
Js动态创建div
2008/09/25 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python模块restful使用方法实例
2013/12/10 Python
12步教你理解Python装饰器
2016/02/25 Python
Python使用剪切板的方法
2017/06/06 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
通过实例学习Python Excel操作
2020/01/06 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
幼儿园三八妇女节活动方案
2014/03/11 职场文书
好的旅游活动方案
2014/08/19 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
开展警示教育活动总结
2015/05/09 职场文书
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript