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 Tkinter GUI编程入门介绍
Mar 10 Python
Python求解平方根的方法
Mar 11 Python
Python对象转JSON字符串的方法
Apr 27 Python
Python中 Lambda表达式全面解析
Nov 28 Python
Python 将pdf转成图片的方法
Apr 23 Python
flask框架中勾子函数的使用详解
Aug 01 Python
详解Python3定时器任务代码
Sep 23 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
python socket 聊天室实例代码详解
Nov 14 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 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版)
2006/10/09 PHP
第三节--定义一个类
2006/11/16 PHP
PHP 的几个配置文件函数
2006/12/21 PHP
javascript读取RSS数据
2007/01/20 Javascript
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python yield与实现方法代码分析
2018/02/06 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
党员批评与自我批评发言稿
2014/10/14 职场文书
入党转正介绍人意见
2015/06/03 职场文书
运动会通讯稿100字
2015/07/20 职场文书
工伤事故赔偿协议书
2015/08/06 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server