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 相关文章推荐
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 Python
详解Python中列表和元祖的使用方法
Apr 25 Python
python计算圆周率pi的方法
Jul 11 Python
Python正则表达式常用函数总结
Jun 24 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
Python 支付整合开发包的实现
Jan 23 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
pytorch实现查看当前学习率
Jun 24 Python
Python中第三方库Faker的使用详解
Apr 02 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
Vue精简版风格概述
2018/01/30 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
Python定时执行之Timer用法示例
2015/05/27 Python
深入解析Python中的urllib2模块
2015/11/13 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
Django的CVB实例详解
2020/02/10 Python
python扫描线填充算法详解
2020/02/19 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
社会公德演讲稿
2014/05/20 职场文书
任命书怎么写
2014/06/04 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
装修活动策划方案
2014/08/27 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
环卫个人总结
2015/03/03 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
新教师教学工作总结
2015/08/14 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB