使用 lambda 函数对 filter() 进行复杂性分析

2023-12-02

给定两个列表,list1 and list2

list3 = filter(lambda x: x in list1,list2)

这将返回两个列表的交集。

我怎样才能找到这个算法的复杂度?我发现时间复杂度x in list1 is O(n)其中 n 是列表中的元素数量,但是怎么样filter?


你的代码确实O(len(list1) * len(list2))元素的比较操作。

  • 您的 lambda 函数已执行O(len(list2))次,每个过滤元素一次。请参阅文档filter在Python 3中 (Python 2):

    filter(function, iterable)

    构建一个iterator from 的那些元素iterable哪个函数返回 true. iterable可以是序列、支持迭代的容器或迭代器

    (强调我的)

    显然,对于可迭代中的每个(不同)元素,该函数至少被调用 1 次 - 知道何时不需要调用它也意味着解决一般情况下的停止问题,甚至连 Python 核心开发人员都还没有解决这个问题;-)。在 Python 3 的实践中filter builtin创建一个迭代器,当advanced,对迭代顺序中的每个元素(无论是否不同)执行该函数一次。

  • The x in list1 does O(len(list1))如记录的那样,对平均情况和最坏情况进行比较。


要加快速度,请使用set;而且你根本不需要 lambda 函数(使用__contains__魔术方法)

list3 = filter(set(list1).__contains__, list2)

这构建了一个set of the list1曾在O(len(list1))时间并对其运行过滤器O(len(list2))平均复杂度为O(len(list1) + len(list2))


如果元素的顺序为list2 不要紧那么你也可以做

set(list1).intersection(list2)

其常数应该比执行的要低filter多于;对于真正快速的代码,您应该对列表进行排序,以便smaller变成一个集合(因为交集和集合构建都记录了平均复杂度O(n),但由于调整大小,集合构建很可能会有更大的常数set,因此从较小的集合构建集合以减少这些常量的权重是有意义的):

smaller, larger = sorted([list1, list2], key=len)
result = set(smaller).intersection(larger)

请注意,Python 2 和 3 彼此不同。filter在 Python 3 中返回一个生成器,实际运行时间取决于生成的生成器消耗的元素数量,而在 Python 2 中将预先生成一个列表,如果您只需要第一个值,则成本可能会更高。

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

使用 lambda 函数对 filter() 进行复杂性分析 的相关文章

  • sklearn DeprecationWarning 数组的真值

    从文档中运行 rasa core 示例 python3 m rasa core run d models dialogue u models nlu default current 并在对话框中的每条消息后获取此错误输出 sklearn D
  • CVXPY 二次规划; ArpackNoConvergence 错误

    我尝试使用 Python 包 CVXPY 来解决第一种形式的凸二次规划问题 https www cvxpy org examples basic quadratic program html https www cvxpy org exam
  • 如何修复 Apache mod_wsgi 的 Python 版本不匹配问题?

    我收到此错误 Thu Jul 12 14 31 36 2012 error python init Python version mismatch expected 2 6 7 found 2 6 8 当尝试启动 Apache 服务器时 在
  • 在 Python 中绘制分类数据的三个维度

    我的数据包含三个我试图可视化的分类变量 城市 五个之一 职业 四种之一 血型 四种之一 到目前为止 我已经成功地以一种我认为易于使用的方式对数据进行了分组 import numpy as np pandas as pd Make data
  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 从主机名中提取域名

    是否有一种编程方式可以从给定的主机名查找域名 给出 gt www yahoo co jp 返回 gt yahoo co jp 有效但非常慢的方法是 拆分为 并从左侧删除 1 个组 使用 dnspython 加入并查询 SOA 记录 当返回有
  • 如何在Python中求和

    我想知道如何在 python 中表示总和而不需要像这样的循环here http docs scipy org doc scipy reference tutorial optimize html 我们有 def rosen x The Ro
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何删除 pandas 数据框中的唯一行?

    我遇到了一个看似简单的问题 在 pandas 数据框中删除唯一的行 基本上 相反drop duplicates https pandas pydata org pandas docs stable generated pandas Data
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 使用 Python 脚本打开特定文件类型?

    如何使 Python 脚本成为特定文件类型 例如 foo 的默认应用程序 例如 当我双击 Finder Explorer 中的文件时 我希望该文件在 Python 脚本中打开 这可以在 Win 和 或 OS X 中实现吗 如果重要的话 该应
  • 如何加速 pandas 字符串函数?

    我正在使用 pandas 矢量化 str split 方法来提取从 上的拆分 返回的第一个元素 我还尝试使用 df apply 与 lambda 和 str split 来产生等效的结果 使用 timeit 时 我发现 df apply 的
  • Qcut Pandas:ValueError:Bin 边缘必须是唯一的

    我使用 Pandas 中的 Qcut 将数据离散化为大小相等的存储桶 我想要有价格桶 这是我的数据框 productId sell prix categ popularity 11997 16758760 0 28 75 50 524137
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • 如何限制scrapy请求对象?

    所以我有一个蜘蛛 我认为它正在泄漏内存 结果当我检查 telnet 控制台 gt gt gt prefs 时 它只是从链接丰富的页面中抓取了太多链接 有时它会超过 100 000 个 现在我已经一遍又一遍地浏览文档和谷歌 但我找不到一种方法
  • 如何将 fields 参数传递到 Google Drive Python API 调用中

    I have results drive service files list body execute where body q query string maxResults 1 为了提高性能 我想限制返回的字段 如下所述 https
  • Matplotlib 中的 TwoSlopeNorm 未按预期工作

    我正在尝试创建一个具有发散颜色图的绘图 该颜色图在零附近不对称 In this https stackoverflow com a 20146989 6288682例如 DivergingNorm函数被使用并产生我想要的 然而 我使用的是更

随机推荐