Python 快速排序 - 列表理解与递归(分区例程)

2023-11-27

我看了演讲《三个美丽的快速排序》,并开始尝试快速排序。我在 python 中的实现与 c 非常相似(选择枢轴,围绕它进行分区并在较小和较大的分区上递归)。我以为不是pythonic.

这就是在 python 中使用列表理解的实现。

def qsort(list):
    if list == []: 
        return []
    pivot = list[0]
    l = qsort([x for x in list[1:] if x < pivot])
    u = qsort([x for x in list[1:] if x >= pivot])
    return l + [pivot] + u

我们将递归方法称为 qsortR。现在我注意到对于大型(r)列表,qsortR 的运行速度比 qsort 慢得多。实际上,即使对于递归方法的 1000 个元素,“cmp 中也超出了最大递归深度”。我在 sys.setrecursionlimit 中重置了它。

一些数字:

list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482

所有的代码都是here.

我有一些问题:

  • 为什么列表理解速度这么快?
  • Some enlightenment on the limit on recursion in python. I first set it to 100000 in what cases should I be careful?
    • (“优化尾递归”到底是什么意思,它是如何完成的?)
  • 尝试对 1000000 个元素进行排序占用了我笔记本电脑的内存(使用递归方法)。如果我想对这么多元素进行排序该怎么办?可以进行哪些类型的优化?

  1. 为什么列表理解速度这么快?

    因为列表理解意味着 C 循环比使用 Python 的慢速一般方式要快得多for block.

  2. 关于python中递归限制的一些启示。我首先将其设置为100000,在什么情况下我应该小心?

    万一你内存不足。

  3. 尝试对 1000000 个元素进行排序占用了我笔记本电脑的内存(使用递归方法)。如果我想对这么多元素进行排序该怎么办?可以进行哪些类型的优化?

    Python 的递归会产生这样的开销,因为每个函数调用都会在每次调用时分配大量的堆栈内存空间。

    一般来说,迭代就是答案(在统计上 99% 的用例中将提供更好的性能)。

    谈论内存结构,如果你有简单的数据结构,比如字符、整数、浮点数:使用内置的array.array这比一个内存效率高得多list.

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

Python 快速排序 - 列表理解与递归(分区例程) 的相关文章

随机推荐

  • 在 wxPython 的窗口中显示 .png 图像

    如何显示一个 pngwxPython 窗口中的图像 png wx Image imageFile wx BITMAP TYPE ANY ConvertToBitmap wx StaticBitmap self 1 png 10 5 png
  • Mongoose:将JS对象直接插入数据库

    好的 我有一个 JS 对象 它通过 AJAX POST 到 Nodejs 后端 我想将此 js 对象直接插入到我的猫鼬数据库中 因为对象键已经与数据库模式完美匹配 我目前有这个 不是动态的并且过于复杂 app post items subm
  • 如何使用库

    由于某种原因 我永远无法使用任何语言的外部库 我正在寻找有关如何使用外部库及其工作原理的说明 解释 当我在线搜索时 我得到的片段似乎永远不适用于我下载并尝试使用的任何库 我在 Mac 和 PC 上工作 C 示例都很好 我使用带有 C 插件的
  • 如何使用 kendo 验证器验证日期的格式为 yyyy-MM-dd?

    我有一个剑道日期选择器 其构造如下 date kendoDatePicker format yyyy MM dd footer parseFormats MM dd yyyy dd MM yyyy 我想使用 kendo 验证器来验证日期是否
  • 使用 Python 实现 collat​​z 函数

    我目前在 自动化无聊的事情 中无法完成此挑战 我的代码是 def collatz number global seqNum if seqNum 2 0 return seqNum 2 elif seqNum 2 1 return 3 seq
  • 如何使用Tomcat 8 + Spring Boot + Maven

    根据参考 API使用 Tomcat 8和这个部署 Spring Boot 应用程序教程应该可以使用 Tomcat 8春季启动 默认使用 Tomcat 7 由于某种原因 它对我不起作用 我究竟做错了什么 pom xml
  • Java 6 中 java.nio.file.Files 的替代方案

    我有下面一段使用 java 7 功能的代码 例如java nio file Files 和 java nio file Paths import java io File import java io IOException import
  • 离子/角度传单指令 - 放大/缩小按钮不起作用

    我对传单地图上的默认放大 缩小按钮有一些问题 当我直接加载页面时 一切正常 但是当我将一种状态更改为声明传单指令所在位置时 按钮就不起作用 给你例子 http codepen io anon pen JkyEg editors 101 代码
  • 从指定列中减去 pandas 列

    如何从指定列中动态减去多个 pandas 数据帧列中的值 在这种情况下 如何从存款中减去 A B C 列 并将该值放入相应的 A B C 列中 date deposit A B C 0 2017 01 15 12 5 10 12 1 201
  • PHP 将每个项目的 foreach 输出显示到屏幕上

    我在 php 中注意到的一件事是 在脚本停止工作之前 屏幕上不会输出任何内容 对于我正在从事的项目 我输入了超过 100 个项目的列表 它对每个项目执行 HTTP 请求 完成后 显示一个页面 其中包含每个项目的状态 成功 失败等 我想知道是
  • lastModified() 函数返回当前日期和时间

    我的问题是 为什么当我在网页上使用 document lastModified 时 它会返回当前日期和时间 而不是该页面上次修改的时间 有任何想法吗 提前致谢 实际代码是 因为你现在正在修改它 检查一下这个example 为了根据您的要求进
  • 如何在云端成功托管用 Python 编写的 Telegram 机器人(免费)?

    我跟着本教程使用 Python 创建 Telegram 机器人 最后 我在我的机器上本地运行它ngrok 为了测试这个机器人 我在 Telegram 中向它发送了消息 有效 所以这是一个很好的教程 但是 现在我想在云端托管机器人 因为我当然
  • Rails/Javascript:如何将 Rails 变量注入(非常)简单的 javascript

    我想在rails中编写一个非常简单的javascript计算器 它将输入字段的数量乘以rails变量中存储的数字 item base price 所以 在 javascript coffeescript 方面 粗略地说是这样的 app as
  • 如何从 C 程序中获得 100% CPU 使用率

    这是一个非常有趣的问题 所以让我来介绍一下场景 我在国家计算博物馆工作 我们刚刚设法让一台 1992 年的 Cray Y MP EL 超级计算机运行起来 我们真的很想看看它能跑多快 我们认为最好的方法是编写一个简单的 C 程序来计算素数并显
  • 在 python 包中添加和读取 config.ini 文件

    我正在编写我的第一个 python 包 我想将其上传到 PyPI 上 我基于此构建了我的代码博客文章 我想将用户设置存储在 config ini 文件中 在同一包中的单独 python 模块中读取一次 每次运行包时 并将用户设置保存在该模块
  • 测试使用会话的 Sinatra 应用程序

    如何测试使用会话的 Sinatra 应用程序 get rack session gt foo gt blah 这段代码对我不起作用 我在我的应用程序中有 启用 会话 看起来问题实际上是有enable sessions活性 您必须停用此设置才
  • 如何在 .Net 中操纵令牌权限?

    我想使用 C 来确定分配给我的进程 线程令牌的权限 并根据需要进行调整 例如 为了让我的程序重新启动计算机 它必须首先启用SeShutdownPrivilege特权 如何通过托管代码安全地完成此操作 事实证明这并不简单 因为没有内置的机制
  • 我使用 AFNetWorking 时出现错误代码 -1011

    我在我们的客户公司做服务 我尝试通过 AFNetWorking 从他们的服务器获取一些信息 我们的客户鼓励使用 AFNetWorking 我使用 AFNetWorking 做了一些示例 并且成功了 但是当我使用我们的客户 URL 之一来获取
  • 如何调用Blazor服务器端CircuitHandler中的方法?

    我正在通过 Blazor 服务器端制作一个聊天室应用程序 我想显示每个用户的在线状态 我问了一个关于如何在关闭页面时获取事件的问题如何在 blazor 服务器端关闭页面时获取事件 现在看来CircuitHandler是最好的选择 当用户关闭
  • Python 快速排序 - 列表理解与递归(分区例程)

    我看了演讲 三个美丽的快速排序 并开始尝试快速排序 我在 python 中的实现与 c 非常相似 选择枢轴 围绕它进行分区并在较小和较大的分区上递归 我以为不是pythonic 这就是在 python 中使用列表理解的实现 def qsor