繁体   English   中英

Python heapq与排序的复杂性和性能

[英]Python heapq vs. sorted complexity and performance

我是python的新手(使用v3.x语法),并且会喜欢关于heapq与sorted的复杂性和性能的注释。

我已经为贪婪的“找到最佳工作时间表”算法实现了基于heapq的解决方案。 但后来我了解了将'sorted'与operator.itemgetter()和reverse = True一起使用的可能性。

遗憾的是,我找不到关于'sorted'与heapq的预期复杂性和/或性能的任何解释。

如果你使用二进制堆按顺序弹出所有元素,你所做的事情基本上是heapsort 它比sorted函数中的 algorightm慢,除了它的实现是纯python。

如果您需要动态添加元素,则heapqsorted更快,即添加和插入可能以未指定的顺序排列。 在任何堆中添加保留内部顺序的新元素比在每次插入后使用数组更快。

如果您需要稍后检索所有元素,则sorted更快。

他们可以竞争的唯一问题 - 如果你需要收集的一些最小(或最大)元素。 虽然对于这种情况有特殊的算法,但是这里的 heapq或者sorted是否会更快取决于初始数组的大小和你需要提取的部分。

heapq实现为二进制堆 ,关于二进制堆的关键事项,以及扩展, heapq

  1. 不支持搜索
  2. 插入是平均不变的时间
  3. 删除平均为O(log n)时间

此处描述了其他二进制堆信息: http//en.wikipedia.org/wiki/Binary_heap

虽然heapq是具有二进制堆属性的数据结构 ,但使用sorted是一个不同的概念。 sorted返回一个排序列表 ,因此它本质上是一个结果,而heapq是一个你不断使用的数据结构 ,可以选择通过sorted进行sorted

产生额外的sorted信息在这里: https://docs.python.org/3.4/library/functions.html#sorted

具体到底你想要完成什么?

回应OP的评论:

为什么你认为你需要专门的heapq 二进制堆是一种专门的数据结构 ,根据您的要求,它很可能没有必要。

你似乎非常关心性能,但目前尚不清楚原因。 如果有什么东西是“表现不好”,但它的总时间并不重要,那么从大局来看,这无关紧要。 在总体情况下, dictlist通常会执行罚款。 为什么你特别认为需要heapq

我想知道这是不是一个不容易完美的敌人的好局面。

使用C扩展编写Python是一个利基用例,保留用于性能确实是一个重要问题的情况。 (也就是说,如果你处理的是大型文件并且性能是你的主要考虑因素,那么使用一个C扩展XML解析器可能比使用纯Python的更好。)

关于In complex继续玩结构案例:通过.append()对排序和添加元素进行排序可能更快

我还不清楚这里的用例是什么。 正如我上面提到的, sortedheapq实际上是两个不同的概念。

您对性能如此关注的用例是什么? (如果没有其他尚未指定的因素,我认为您可能过分强调代码中最佳案例性能的重要性。)

如果您尝试查找相对较少数量的项目,则heapqnlargest()nsmallest()函数最合适。 如果你想找到单个最小或最大的数字,min()和max()是最合适的,因为它更快,并使用sorted然后切片。 如果您正在寻找N个最小或最大的物品,并且N与集合的整体尺寸相比较小,这些功能可提供卓越的性能。 虽然没有必要在代码中使用heapq,但它只是一个有趣的主题,值得研究。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM