Python中关于list和set的搜索效率及底层原理浅析

2023-11-03

从上图可以看到,同样情况下,在set中查找大概60纳秒,在list中查找大概440微秒=440*1000纳秒=440000纳秒。所用时间大概是set的6000倍。

总结原因:

  • list是顺序存储的,在查找的时候遍历整个数组,所以时间复杂度是O(n)
  • set在底层是被设计成没有值的字典型,即只有key没有value。而字典dict类型在python中的实现是基于hash map哈希表的,有一个映射关系,所以在查找时候,通过哈希函数f(x)就能轻易地找到相应的值,所以时间复杂度是O(1)。在Python中,我们平时定义的对象或者它内置的对象很多都是基于dict来建立的。
  • 但是dict占的内存相对较大,另外由于是使用哈希表,所以内存空间的使用不是连续的,所以当dict中剩余的内存空间小于申请的空间的1/3时,就触发扩容机制,在另一块内存空间中申请一块更大的内存,将当前的数据挪到申请的新内存上。在挪之前,dict中数据是按照输入时的顺序存放的,即有序的。但是在挪了之后,由于空间变大,所以相应的hash函数也要相应变大,数据存放位置需要重新hash,所以扩容之后,dict中的顺序可能改变。
  • 另外,当存到dict中的数据通过hash都指向一块内存的时候,即发生哈希冲突问题,在通过其它方法解决之后,再在搜索的过程时,对于一个hash值的那些数据,只能顺序搜索,所以若是n个数据都是一个hash值,那么它的查找效率就是O(n).
  • 由于底层使用hash实现,所以对于dict的键key以及set中的数据,都需要是不可变对象,即:int、float、str、tuple等。另外:set相当于是可变对象(底层是dict),所以不能作为dict的键或者存储在set中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中关于list和set的搜索效率及底层原理浅析 的相关文章

随机推荐

  • 20230504 - 二叉树3

    1 104 二叉树的最大深度 class solution 递归法 public int maxDepth TreeNode root if root null return 0 int leftDepth maxDepth root le
  • 查看当前用户名称:whoami命令

    没什么可讲的 就是显示当前用户名称 效果同 id un 命令 转载于 https www cnblogs com Stong p 6812866 html
  • 医学图像格式转换 -- .dcm转为.nii.gz

    注 代码主要根据 dcm2nii 多张dcm 文件转换成nii等其他格式的存储 进行函数整合 感谢原作者 coding utf 8 import SimpleITK as sitk def dcm2nii dcms path nii pat
  • oracle改表结构非空字段类型,Oracle修改表结构语句

    1 修改表的字段 修改一个列的数据类型 一般限于修改长度 修改为一个不同类型时有诸多限制 语法 ALTER TABLE 表名 MODIFY 列名 数据类型 eg1 alter table skate test modify author n
  • 解决“'export' is only available in ES6 (use 'esversion: 6')”问题

    问题 export is only available in ES6 use esversion 6 截图 把鼠标移上去就会有这个提示 解决方法 在顶部加入这句话 jshint esversion 6 如图所示 没有红色下滑线啦 完美解决
  • Discuz!教程之后台隔段时间需要重新登录的解决方法

    用Discuz 的站长们都有一个很苦恼的问题 就是后台登录页面过一段时间再去操作就要重新登录 非常不方便 为了减少站长们的工作量 本文给站长们介绍放宽disduz后台登录默认限制方法 一 取消检测管理员ip 1 用ftp工具连接您的虚拟主机
  • 一个简单通用的logback配置文件

    首先pom依赖于ch qos logback基于slf4j
  • Spark SQL架构工作原理及流程解析

    前言 Spark SQL架构工作原理及流程解析 spark sql从shark发展而来 Shark为了实现Hive兼容 在HQL方面重用了Hive中HQL的解析 逻辑执行计划翻译 执行计划优化等逻辑 Spark SQL兼容Hive 因为Sp
  • DFRobot离线语音识别模块真实测评

    春节前在DF商城到上架两款新品 分别是离线语音识别模块 离线语音合成模块 它们和二哈识图一起组成了 人工智能三剑客 其中语音识别模块有现货 语音合成模块接受预定 心痒痒想在春节尝鲜 看商城公告春节发货截止日期2月7日 于是6日上午匆匆下单
  • 学习笔记(一):Java中Stream的基本用法和相关API详解

    目录 引言 一 什么是Stream 二 Stream有什么用 三 Stream的分类 四 常用的Stream创建方法 1 Stream of 方法 2 Arrays stream 3 集合对象中的stream 方法 五 Stream的常见操
  • opencv缩小图片的方法

    scaling factor 0 4 img scaled cv2 resize img None fx scaling factor fy scaling factor interpolation cv2 INTER LINEAR 双线性
  • 带你了解『百度智能云发布云智一体的AI开发全栈模式』

    在 云智一体 的独家优势下 百度智能云为企业的 AI 开发打开了更多可能 3月27日 百度智能云2021云智技术论坛首场活动在京举行 重磅发布 云智一体的 AI 开发全栈模式 基于百度全球领先的 AI 技术和生态优势 AI 原生的云基础设施
  • 如何判断一个以太坊地址是不是合约地址?

    转载自https blog csdn net shebao3333 article details 80043317 使用web3 js web3 eth getCode 方法返回指定地址上代码的16进制字符串 由于普通账户地址处没有代码
  • osgcuda

    osgcuda 转 原文 http blog sina com cn s blog df1b276a0101inbi html osgCompute是对代码的并行流处理器执行的抽象基库 库连接到OSG的 OSG 因此它可以被包括在场景图 它
  • ReadTimeoutError: HTTPSConnectionPool(host=‘cdn-lfs.huggingface.co‘, port=443)

    问题 最近遇到需要从hugging face下载并导入预训练模型SimCSE 然后进行计算文本相似度 代码如下 from transformers import AutoModel AutoTokenizer import os os en
  • python爬取京东商品评论(可实现翻页)

    上一篇文章 我们已经实现抓取商品第一页的功能 下面来实现翻页的功能 首先通过类定义三个方法 初始化方法 解析一页的方法 翻页爬取 class jd comment object def init self pass def page sel
  • iOS 中集成 FFmpeg

    FFmpeg是一套可以用来记录 转换数字音频 视频 并能将其转化为流的开源计算机程序 它提供了录制 转换以及流化音视频的完整解决方案 ffmpeg的代码是包括两部分的 一部分是library 一部分是tool api都是在library里面
  • 靶场复现————平行越权、垂直越权

    知识学习 不能上升到现实 确对不能 什么是越权 越权漏洞的概念 越权漏洞是一种很常见的逻辑安全漏洞 是由于服务器端对客户提出的数据操作请求过分信任 忽略了对该用户操作权限的判定 导致修改相关参数就可以拥有了其他账户的增 删 查 改功能 从而
  • 第1章 实践基础

    文章目录 第1章 实践基础 1 1 如何运行本书的代码 1 1 1 本地运行 1 1 1 1 环境准备 1 1 1 2 快速安装 1 1 2 AI Studio运行 1 2 张量 1 2 1 创建张量 1 2 1 1 指定数据创建张量 1
  • Python中关于list和set的搜索效率及底层原理浅析

    从上图可以看到 同样情况下 在set中查找大概60纳秒 在list中查找大概440微秒 440 1000纳秒 440000纳秒 所用时间大概是set的6000倍 总结原因 list是顺序存储的 在查找的时候遍历整个数组 所以时间复杂度是O