为什么将列表转换为集合比仅使用列表计算列表差异更快?

2023-11-26

比如说,我想计算两个列表的差异C = A - B:

A = [1,2,3,4,5,6,7,8,9] 
B = [1,3,5,8,9]
C = [2,4,6,7]          #Result

A and B都用唯一的整数排序(不确定是否有办法告诉Python列表的这个属性)。我需要保留元素的顺序。 AFAIK 有两种可能的方法

Method 1: 将 B 转换为集合并使用列表推导式生成 C:

s = set(B)
C = [x for x in A if x not in s]

Method 2: 直接使用列表理解:

C = [x for x in A if x not in B]

Why is #1比更有效率#2?转换成集合没有开销吗?我在这里缺少什么?

一些性能基准给出在这个答案。

UPDATE:我知道一组的平均值O(1)查找时间胜过列表的查找时间O(n)但如果原始列表A包含大约一百万个左右的整数,集合的创建实际上不会花费更长的时间吗?


将列表转换为集合会产生开销,但集合是实质上比列表更快in tests.

您可以立即查看是否有商品x已在集合中y因为下面使用了一个哈希表。无论你的集合有多大,查找时间都是相同的(基本上是瞬时的)——这在 Big-O 表示法中称为 O(1)。对于列表,您必须单独检查每个元素以查看项目是否x在列表中z。随着列表的增长,检查将花费更长的时间 - 这是 O(n),这意味着操作的长度与列表的长度直接相关。

速度的提高可以抵消集合创建的开销,这就是您的集合检查最终变得更快的原因。

编辑:为了回答另一个问题,Python 无法确定你的列表是否已排序 - 如果你使用的是标准则不行list无论如何,对象。因此它无法通过列表理解实现 O(log n) 性能。如果您想编写自己的二分搜索方法(假设列表已排序),您当然可以这样做,但 O(1) 随时都会击败 O(log n)。

EDIT 2:

我知道集合的平均 O(1) 查找时间优于列表的查找时间 O(n) 但如果原始列表 A 包含大约一百万左右 整数,集合创建实际上不会花费更长的时间吗?

一点都不。从列表中创建一个集合是一个 O(n) 操作,因为将一个项目插入到一个集合中的时间复杂度是 O(1) 并且您需要执行 n 次。如果你有一个包含一百万个整数的列表,将其转换为一个集合需要两个 O(n) 步骤,而重复扫描该列表将需要 n O(n) 步骤。实际上,对于具有一百万个整数的列表,创建集合的速度大约要快 250,000 倍,并且列表中的项目越多,速度差异就会越来越大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么将列表转换为集合比仅使用列表计算列表差异更快? 的相关文章

随机推荐

  • 意外的 strtok() 行为

    我正在尝试使用 strtok 计算文件中的单词数 code c WHAT Use strtok to count the number of words in a file include
  • 使用Python的unittest模块作为测试运行程序时,如何在测试之前运行初始化代码?

    在运行库提供的测试之前 库的用户如何运行自己的初始化代码 例如设置记录器的调试级别 蟒蛇的unittest模块用作测试运行器 您可以尝试使用 pytest 来运行单元测试 如果这有效 许多基于单元测试的测试套件都有效 那么您可以创建一个小模
  • 如何使用 Powershell 删除 IIS 自定义标头?

    我正在编写一个将网站部署到 IIS 7 的 powershell 脚本 我想使用 powershell 中的 Web 管理模块而不是使用 appcmd 执行以下命令来删除自定义标头 如何在不使用 appcmd 的 powershell 中执
  • 在 bash 中回显打印 -e

    我已经得到了在 Bash 中创建的脚本 我正在使用的功能之一是echo我正在使用 e解释标志 反斜杠转义 我有一个以彩色打印文本的脚本 但是当它回显将要以彩色显示的消息时 它也会打印 e带有消息的标记 此处为例 NC 033 31 0m n
  • 如何取消或停止 Google App Engine Cron 作业

    我将一个使用 CRON 作业的应用程序部署到我的 Google App Engine 我跟着this教程 它工作正常 我可以在我的 GAE 控制台中确认它 在我的 Stackdriver 日志中 我还可以看到 CRON 作业正在运行 但我对
  • 尝试在 Lumen 中重置密码

    我正在尝试在 Lumen 中实现密码重置功能 但未能成功 Lumen 可以访问 Laravel 之类的东西密码经纪商 and 密码管理器但我无法使用它并成功 有没有什么解决办法呢 我昨晚才真正弄清楚这一点 并写了一篇关于它的博客 http
  • 布局内的 OpenGL 视图

    如何设置包含 OpenGL 视图的 xml 布局 我现在所做的就是使用 setContentView 将 OpenGL 视图设置为唯一的视图 但我想创建一个包含 OpenGL 视图的 xml 布局 假设我主要想要 OpenGL 视图 并在底
  • 当用户在 jquery 中按 Enter 键时将
    添加到文本框

    我想添加 br 当用户单击输入按钮时 换行符 到文本框 我怎样才能在jquery中实现它onkeyup事件 可以给我展示一个示例或任何实现它的好网站吗 谢谢 从这里复制的文本区域中的插入符位置 从头开始的字符数 See DEMO
  • AJAX GET 请求中查询字符串的最大长度?

    执行 AJAX GET 请求时 查询字符串的最大长度是否存在 更具体地说 我正在使用图像进行跨域 AJAX img new Image img src http www otherdomain com something gif long
  • 获取提供给泛型方法的泛型参数类型和值

    如何获取提供给封闭 构造泛型方法的参数值 已经有一段时间没有接触Reflection了 所有这些都曾经是我的 嗯 无论如何 class Program static void Main string args new ConcreteFoo
  • JVM堆参数

    在阅读了有关该主题的已经提出的问题和大量谷歌搜索后 我仍然无法清楚地了解 Xms option 我的问题是 有什么区别java Xms 512m Xmx 512m and java Xms 64m Xmx 512m 现在我有以下答案 唯一的
  • Chai 断言测试对象结构是否至少包含其他对象结构

    我使用 Mocha 进行单元测试 使用 Chai 进行断言 我想找到一个易于使用的解决方案来检查对象是否具有比较对象中定义的结构和属性 但我不需要对象完全相等 被测对象应包含at least我的测试对象中的所有属性 但它也可能包含当时未测试
  • 如何将工具栏添加到 NSTableView 的底部?

    看看下面的图片 我怎样才能将这种栏添加到我自己的NSTableViews中 其他用途在网络首选项应用程序中 使这项工作成功的秘诀是什么 我不认为有什么 魔术 这是你必须自己实现的事情 看起来像是一群Gradient style NSButt
  • 同时具有接口和实现的 Golang 泛型

    我正在尝试编写以下函数 func Fill X any slice X for i range slice slice i new X xs make int 10 fill with nils Fill xs now fill with
  • 如何在 JavaScript 中创建一个索引从 1 开始的数组?

    默认情况下 每个 JavaScript 数组的索引从 0 开始 我想创建一个索引从 1 开始的数组 我知道 一定很微不足道 感谢您的帮助 这并不是一件小事 不可能 您能做的最好的事情就是使用从 1 开始的数字属性创建一个对象 但这不是同一件
  • 抽象属性(不是属性)?

    定义抽象实例属性而不是属性的最佳实践是什么 我想写一些类似的东西 class AbstractFoo metaclass ABCMeta property abstractmethod def bar self pass class Foo
  • Dropzone 图片上传选项不起作用:(

    我正在尝试构建拖放图像上传 但拖放区选项不起作用 我不知道我是否以正确的方式进行操作 我很想设置以下选项 只上传一个文件 multiupload参数 可以删除该文件 addremovelink 最大文件大小为 2mb maxfilesize
  • 如何将 Console.WriteLine 输出保存到文本文件

    我有一个程序可以将各种结果输出到命令行控制台上 如何使用 a 将输出保存到文本文件StreamReader或其他技术 System Collections Generic IEnumerable
  • 运行CMD命令不显示?

    我已经创建了一个进程来在 CMD 中运行命令 var process Process Start CMD exe c apktool d app apk process WaitForExit 如何运行此命令而不显示实际的 CMD 窗口 您
  • 为什么将列表转换为集合比仅使用列表计算列表差异更快?

    比如说 我想计算两个列表的差异C A B A 1 2 3 4 5 6 7 8 9 B 1 3 5 8 9 C 2 4 6 7 Result A and B都用唯一的整数排序 不确定是否有办法告诉Python列表的这个属性 我需要保留元素的顺