set issubset 性能差异取决于参数类型

2023-11-27

为什么提出此问题呢 ?

我试图回答这个问题:检查所有值是否作为字典中的键存在比生成器理解更好的东西all(与某些函数执行的隐式循环相比,Python 循环即使在推导式中也会减慢执行速度):

all(i in bar for i in foo)

where bar是一本字典并且foo是一个列表,使用set.issubset(转换为set of foo能够使用foo.issubset(bar)),并没有成功地击败时代all解决方案(除非两个容器都转换为sets).

我的问题:

从文档set:

请注意,union()、intersection()、difference()、symmetry_difference()、issubset() 和 issuperset() 方法的非运算符版本将接受任何可迭代对象作为参数。相反,基于运算符的对应部分需要设置其参数。这排除了像 set('abc') 和 'cbs' 这样容易出错的结构,有利于更具可读性的 set('abc').intersection('cbs')。

好的,但性能实际上取决于参数的类型,即使复杂性并不(Python的复杂度是subset()):

import timeit
foo = {i for i in range(1, 10000, 2)}
bar = foo - {400}
n=10000
x = timeit.timeit(setup="foo = {str(i) for i in range(1, 10000, 2)};bar = foo - {'400'}",stmt="bar.issubset(foo)",number=n)
print("issubset(set)",x)
x = timeit.timeit(setup="foo = {str(i) for i in range(1, 10000, 2)};bar = foo - {'400'};foo=list(foo)",stmt="bar.issubset(foo)",number=n)
print("issubset(list)",x)
x = timeit.timeit(setup="foo = {str(i):i for i in range(1, 10000, 2)};bar = set(foo) - {'400'}",stmt="bar.issubset(foo)",number=n)
print("issubset(dict)",x)
x = timeit.timeit(setup="foo = {str(i):i for i in range(1, 10000, 2)}.keys();bar = set(foo) - {'400'}",stmt="bar.issubset(foo)",number=n)
print("issubset(dict_keys)",x)

我的结果(Python 3.4):

issubset(set) 1.6141405847648826
issubset(list) 3.698748032058883
issubset(dict) 3.6300025109004244
issubset(dict_keys) 4.224299651223102

So if a set作为参数传递,结果非常快。

Using a list速度要慢得多。我发现这是因为必须在字符串上完成的哈希成本很高。所以我用这样的整数更改了我的测试输入:

foo = {i for i in range(1, 10000, 2)}
bar = foo - {400}

结果在全球范围内更快,但仍然存在巨大的时差:

issubset(set) 0.5981848205989139
issubset(list) 1.7991591232742143
issubset(dict) 1.889119736960271
issubset(dict_keys) 2.2531574114632678

我也尝试过改变dict by dict.keys()就像在 python 3 中一样,键据说是(https://www.python.org/dev/peps/pep-3106/) “类似集合或无序的容器对象”。

但在这种情况下,结果甚至比dict or list.

那么为什么要通过一个set击败通过list or a dict or a dict_keys object?我没有在文档中看到任何关于此的内容。


The set.issubset算法需要一个集合来使用(冻结集和子类计数);如果你传递其他东西,它就会组成一个集合。基本上是all(elem in other for elem in self),并且它需要知道elem in other是有效的并且意味着它对于集合意味着什么。它知道如何保证这一点的唯一方法是确保other是一个集合。制作一套很贵。

(我已经掩盖了一些细节。如果您想确切地知道发生了什么,特别是如果您有一个奇怪的集合子类,请阅读链接中的源代码。)

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

set issubset 性能差异取决于参数类型 的相关文章

随机推荐

  • 如何在 Python 中将向量投影到由其正交向量定义的平面上?

    我有一架飞机 plane A 由其正交向量定义 例如 a b c 即向量 a b c 正交于plane A 我想投影一个向量 d e f onto plane A 我怎样才能用Python做到这一点 我想一定有一些简单的方法 Take d
  • 如何访问jar文件中的资源(Excel文件)

    您好 我已将 java 项目导出为可执行 jar 文件 在我的项目中 我正在访问一个包含一些数据的 Excel 文件 现在 当我尝试访问 Excel 文件时 无法访问该文件 我的项目结构是 Java 项目 文件夹 src 文件夹 resou
  • 如何在Flutter中使用MediaQuery设置文本的scaleFactor?

    通过 MediaQuery 我可以获得 Samsung S7 Edge 屏幕尺寸的高度和宽度 以便我可以使用它 但是如何使用MediaQuery在ListTile中布局多列动态文本呢 在我的演示项目中 我将文本大小设置为 12 在 Sams
  • Android - 如何使图标在触摸时发光?

    如何在图标上获得蓝色发光效果 有什么快速的方法吗 我真的不想用photoshop来实现这种效果 任何帮助将非常感激 如果您想以编程方式生成发光 可以按以下方法操作 我的建议是 在活 动开始时只生成一次 然后使用它创建一个 StateList
  • 即使没有内存不足,我也会遇到 java.lang.OutOfMemoryError 吗?

    我正在读书揭开 java lang Outofmemory 错误的面纱我想知道我是否理解正确 如果 Java VM 抛出异常 这是真的吗 java lang OutOfMemoryError 请求的数组大小超出VM限制 这意味着VM拒绝创建
  • 使用 Powershell 更改 IIS6 站点主目录

    我正在尝试使用 powershell 更改站点的主目录 这是我到目前为止所拥有的 但它没有保存更改 server localhost siteName mysite iis ADSI IIS server W3SVC site iis ps
  • Pandas GroupBy 借助 CSV 中的大型数据集

    一个常见的 SQLism 是 从 A 的表组中选择 A 平均值 X 我想在 pandas 中复制它 假设数据存储在 CSV 文件之类的文件中 并且太大而无法加载到内存中 如果 CSV 可以容纳在内存中 那么简单的两行代码就足够了 data
  • JSF CommandButton onclick不调用Javascript函数

    我正在使用 JSF 的命令按钮 我不知道为什么我无法调用我的 javascript 函数 当我单击按钮时 不会显示任何警报
  • 将 Hibernate 查询结果检索为结果集而不是列表

    嘿呀 我是冬眠新手 我不得不说它确实简化了 SQL 查询的一切 然而 操作返回的结果目前对我来说是一个头疼的问题 结果以列表形式返回 大多数时候 我真的希望结果位于结果集中 以便我可以更轻松地操作它 因为使用结果集 您可以通过列名或索引指定
  • 为什么 std::uniform_int_distribution::operator() 不是 const?

    据我了解 当用于提取随机数时 分布不应改变 例如 对于均匀分布 当我们使用它生成随机数时 它的最小值 最大值不应该改变 那么为什么操作员 不是const吗 While min and max 不会改变 分布可能包含帮助它生成下一个值的状态
  • Symfony2 Doctrine - PostgreSQL 的 ILIKE 子句?

    我目前正在使用 symfony2 doctrine 2 3 和 PostgreSQL 9 我已经搜索了几个小时 看看我到底该怎么做ILIKE选择与QueryBuilder 看来他们只有LIKE 但在我的情况下 我正在搜索不区分大小写的 到底
  • 在网页上显示每秒更新的txt文件

    我有点像在黑暗中拍摄 我不知道如何做到这一点 所以一些有用教程的指针和 或链接会很棒 我有一个网站 我想显示文本文件 服务器日志 可能是嵌入的 问题是 只要服务器中发生事件 通常快于半秒 该文件就会更新 我怎样才能使网页实时显示文件 即显示
  • Vim 语法高亮显示 Python 的“else:”

    我对 Vim 中默认的 python 语法高亮感到恼火 它没有突出显示else 陈述正确 Vim 仅在 else 语句之间有一些空格时才会突出显示 else 语句else和冒号 so else 有效 但是else 才不是 它一定很容易修复
  • 可以将文本添加到 SVG 路径吗?

    是否可以将文本添加到 svg 路径 我创建了一个 svg 三角形 想在其中心添加一个字母 但不确定这是否可能 是的 看SVG1 1 规范第 10 13 节 标题为 路径上的文本 有关使用textPath元素 总结 给你的路径一个id属性 C
  • 完全外连接,在 2 个数据表上,带有列列表

    我有2个数据表 我不知道它们的数据列列表 该列表必须在运行时提取 并用于完整外连接 使用这些列时 需要合并两个表之间的列 并且我需要显示所有数据 到目前为止我正在做的是 获取公共列 使用 intersect 并实现 IEqualityCom
  • Razor View 抛出“当前上下文中不存在名称“模型””

    在我的 MVC 4 应用程序中进行重大重构后 Razor 在调试视图时显示此错误 当前上下文中不存在名称 model 这是有问题的代码行 model ICollection
  • 应该先考虑什么——设计模式还是代码?

    我正在开始一个全新的项目 我应该查看我的规范并决定应用哪些设计模式 还是只是提出一个总体的组织理念并允许模式通过重构有机地出现 根据您的经验 哪种技术最有成效并且更有可能产生干净优雅的代码 我还想知道是否有一些设计模式不是由 GoF 定义的
  • 将 SSIS 出价与 Visual Studio 2012 / 2013 结合使用

    我想在 Visual Studio 2012 中使用 SSIS BIDS 项目 我安装了 Visual Studio 2010 和 Visual Studio 2012 以及 Microsoft SQL 服务器2012 首先安装了 VS 2
  • 为什么 HTML5 不支持 font 元素?

    我只是真的很好奇 希望有人能在 W3C 的疯狂中揭示这个方法 最新的HTML5标准不支持该元素的原因是什么 我知道该元素在 HTML 4 01 中已被弃用 但我不明白为什么 对我来说 这似乎完全合乎逻辑 您有一段文本 只想更改字体 或者使用
  • set issubset 性能差异取决于参数类型

    为什么提出此问题呢 我试图回答这个问题 检查所有值是否作为字典中的键存在比生成器理解更好的东西all 与某些函数执行的隐式循环相比 Python 循环即使在推导式中也会减慢执行速度 all i in bar for i in foo whe