python中集合(Set)和列表(List)性能比较

文章目录

  • 引言
  • 1. Set和List
  • 2. 性能对比
  • 3. 总结

引言

在当今的软件开发过程中,Python 已经成为了一种极为流行的编程语言,得益于其简洁的语法和强大的库支持。在 Python 中,列表(List)和集合(Set)是两种基本的数据结构,它们在处理数据集时扮演着至关重要的角色。列表以有序的方式存储元素,而集合则提供了无序且不重复的元素存储能力。尽管它们在日常编程中被广泛使用,但在性能上,这两种数据结构表现出了显著的差异,尤其是在元素查找、数据去重等操作中。本文旨在通过实验,比较 List 和 Set 在不同操作下的性能表现,揭示它们在实际应用中的最佳使用场景。

1. Set和List

列表(List)是一种可变的序列,能够存储不同类型的值,包括数字、字符串、甚至其他列表。列表是有序的集合,意味着每个元素都有一个确定的位置,并且可以通过索引来访问。

集合(Set)用于存储唯一的元素,即集合中的元素不会重复。和列表不同,集合是无序的,这意味着集合中的元素没有固定的顺序。

2. 性能对比

由于列表和集合的数据结构上的差异,就注定二者在性能上是存在差异的,本研究探讨二者在运行速度上的差异。

import timeit
import matplotlib.pyplot as plt
import numpy as np# 准备测试数据
sizes = [10, 100, 1000, 10000, 100000]  # 定义不同大小的数据集
list_times = []  # 用于存储列表操作的时间
set_times = []  # 用于存储集合操作的时间for size in sizes:# 为每个大小生成一个列表和一个集合,包含从0到size-1的整数test_list = list(range(size))test_set = set(range(size))# 生成一个不存在于列表和集合中的测试值test_value = size + 1# 测量在列表中查找测试值的时间list_time = timeit.timeit(lambda: test_value in test_list, number=1000)list_times.append(list_time)# 测量在集合中查找测试值的时间set_time = timeit.timeit(lambda: test_value in test_set, number=1000)set_times.append(set_time)# 绘制结果
plt.figure(figsize=(10, 6))
plt.plot(sizes, list_times, label='List', marker='o')  # 绘制列表查找时间
plt.plot(sizes, set_times, label='Set', marker='s')  # 绘制集合查找时间
plt.xscale('log')  # 将x轴设置为对数尺度
plt.yscale('log')  # 将y轴设置为对数尺度
plt.xlabel('Number of Elements')  # x轴标签
plt.ylabel('Time (seconds)')  # y轴标签
plt.title('List vs Set Performance Comparison')  # 图表标题
plt.legend()  # 显示图例
plt.grid(True, which="both", ls="--")  # 显示网格
plt.show()  # 显示图表

上述代码展示了我们分别在列表和集合中存储相同的数据,然后去查找一个不存在于列表和集合中的数据,测试在列表和集合进行查找分别所需要花费的时间。

测试结果可视化如下:
在这里插入图片描述
很明显,在Set中的查询时间是低于在List中查询的时间的。特别是随着数据量的增大,这种差距尤为明显。

3. 总结

  • List (list): Python中的列表是一个有序的元素集合,支持元素的重复出现。列表的搜索操作(例如,检查一个元素是否存在于列表中)是通过遍历整个列表来完成的,这是一个时间复杂度为 O(n) 的操作,其中n是列表的长度。同样,列表中的某些操作(如插入、删除等)也可能需要O(n)的时间复杂度,因为它们可能需要移动列表中的元素。
  • Set (set): Python中的集合是一个无序的、不包含重复元素的集合。它基于哈希表实现,因此可以非常快速地进行查找、添加和删除操作。特别是,检查一个元素是否存在于集合中,以及添加和删除操作,通常具有平均时间复杂度为 O(1)。然而,这种效率是以牺牲有序性和不允许重复元素为代价的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

敏捷开发中如何写好用户故事?

什么是用户故事? 用户故事(user story)是一个用来确认用户和用户需求的简短描述,作为什么用户,希望如何,这样做的目的或者价值何在。用户故事在软件研发中又被描述为需求。用户故事通常的格式为&#xff1…

STL容器之list

​ 1.封装除了对数据的保护、更好地管理数据之外,还有实现了对上层的统一; ​ 2.类模板参数的不同,一方面是为了实例化出来不同的类,另一方面是为了实现类的成员函数的不同; 一、认识list ​ 1.list是一种带头双向循…

java高并发场景面试题,干货来袭

为什么阿里巴巴的持久层抛弃hibernate,采用MyBatis框架? 原因大概有以下4点: 尤其是需要处理大量数据或者大并发情况的网站服务,这也阿里选择MyBatis的原因。 MyBatis整体架构 不多讲,先看目录图 MyBatis源码笔记文档…

捕获在野SMBGhost本地提权攻击样本

前言 从Windows10 v1903/Windows Server v1903开始,微软在协议SMB3.1.1中开启了对数据压缩传输的支持,但是由于SMB没有正确处理压缩的数据包,在客户端/服务端解压数据的时候,没有对COMPRESSIN_TRANSFORM_HEADE结构进行安全校验&a…

【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!

建表字段: CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,nickname VARCHAR(32) NOT NULL COLLATE utf8mb4_general_ci,email VARCHAR(32) NOT NULL COLLATE utf8mb4_general_ci,status SMALLINT(6) UNSIGNED NULL DEFAULT NULL,password VARCHAR(256) NULL DEFAULT…

Netty入门指南:从零开始的异步网络通信

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Netty入门指南:从零开始的异步网络通信 前言Netty简介由来:发展历程:异步、事件驱动的编程模型: 核心组件解析通信协议高性能特性异步编程范式性能优化与…

C++ stack queue详解以及模拟实现

目录 1.stack的使用 1.1stack的定义 1.2stack的使用 1.3stack的构造 2.stack底层模拟实现 3.queue的使用 3.1queue的定义 3.2queue的使用 4.queue底层模拟实现 1.stack的使用 1.1stack的定义 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环…

关于 cocos creator 如何打包抖音字节小游戏步骤一

1、cocos creator打开引擎,在顶部选择构建之后,在选择点击构建(ps:具体看项目组的大小,如果是一个简单的不多资源一般不到一分钟,如果项目很大,就至少半个小时以上),之后 成功构建之后如下所示:…

修改Qt生成iOS应用的原生底层,编译QtBase下的ios子模块

1.下载Qt源码 2.找到ios.pro子工程 3.使用QtCreaor12打开ios.pro工程 4.出现工程下只有一个.pro文件解决 复制修改好的toolchain.prf文件进行替换. 修改方法:

分布式调度平台XXL-JOB

相对来说,xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与SpringBoot有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,对于企业维护起来成本不高,还…

论文阅读-CheckFreq:频繁、精细的DNN检查点操作。

论文名称:CheckFreq: Frequent, Fine-Grained DNN Checkpointing. 摘要 训练深度神经网络(DNNs)是一项资源密集且耗时的任务。在训练过程中,模型在GPU上进行计算,重复地学习权重,持续多个epoch。学习到的权重存在GPU内存中&…

网站三合一缩略图片介绍展示源码

网站三合一缩略图片介绍展示源码,PHP源码,运行需要php环境支持,效果截图如下 蓝奏云下载:https://wfr.lanzout.com/ihY8y1pgim6j

SpringMVC了解

1.springMVC概述 Spring MVC(Model-View-Controller)是基于 Java 的 Web 应用程序框架,用于开发 Web 应用程序。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller&a…

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具 基于java fx写的一款支持加载自定义poc文件的、可扩展的的图形化渗透测试框架。支持批量漏洞扫描、漏洞利用、结果导出等功能。 使用 经过测试,项目可在jdk8环境下正常使用。jdk11因为缺少一些必要的组件,所以jdk11版本工…

vue2+elementui上传照片(el-upload 超简单)

文章目录 element上传附件(el-upload 超详细)代码展示html代码data中methods中接口写法 总结 element上传附件(el-upload 超详细) 这个功能其实比较常见的功能,后台管理系统基本上都有,这就离不开element的…

Rocky Linux 运维工具 mv

一、mv的简介 ​​mv​是Linux系统中的命令,用于移动文件或重命名文件。它可以在同一文件系统内将文件从一个目录移动到另一个目录,也可以修改文件的名称。 二、mv的参数说明 1、 三、mv的实战示例 1、重命名 ###查看目录/root/下的文件列表 [rootloc…

【前端入门】设计模式+单多页+React

设计模式是一种解决特定问题的经验总结,它提供了经过验证的解决方案,可以在软件开发过程中使用。设计模式可以帮助前端开发人员更有效地组织和管理代码,并提供一种共享的语言和框架,以便与其他开发人员进行交流。 以下是一些常见…

可观测性在威胁检测和取证日志分析中的作用

在网络中,威胁是指可能影响其平稳运行的恶意元素,因此,对于任何希望避免任何财政损失或生产力下降机会的组织来说,威胁检测都是必要的。为了先发制人地抵御来自不同来源的任何此类攻击,需要有效的威胁检测情报。 威胁…

《WebGIS快速开发教程》第6版正式发布啦!

大家过完了一个开心快乐团圆的春节之后,现在也开始慢慢进入到工作和学习的节奏中去了,最近的这段时间是大家考研结果公布和换工作的高峰期,很多成绩不太理想的学生和即将打算换工作的同学都可能会想学习webgis相关,因此我们团队赶…

Bicycles(变形dijkstra,动态规划思想)

Codeforces Round 918 (Div. 4) G. Bicycles G. Bicycles 题意: 斯拉夫的所有朋友都打算骑自行车从他们住的地方去参加一个聚会。除了斯拉维奇,他们都有一辆自行车。他们可以经过 n n n 个城市。他们都住在城市 1 1 1 ,想去参加位于城市…