我相对较新于使用Python(使用v3.x语法),并希望了解heapq和sorted的复杂性和性能方面的注意事项。
为贪心的“找到最佳作业调度”算法已经实现了基于heapq的解决方案。但是,我了解到可以使用“sorted”及operator.itemgetter()和reverse=True。
不幸的是,我找不到有关“sorted”与heapq预期复杂性和/或性能的任何解释。
我相对较新于使用Python(使用v3.x语法),并希望了解heapq和sorted的复杂性和性能方面的注意事项。
为贪心的“找到最佳作业调度”算法已经实现了基于heapq的解决方案。但是,我了解到可以使用“sorted”及operator.itemgetter()和reverse=True。
不幸的是,我找不到有关“sorted”与heapq预期复杂性和/或性能的任何解释。
sorted
函数中的排序算法慢。heapq
比sorted
更快。在任何堆中保留内部顺序的添加新元素比每次插入后重新排序数组更快。sorted
更快。heapq
或sorted
哪个更快取决于初始数组的大小和您需要提取的部分。sorted
函数以及创建另外10,000个数字并使用heapq.heappush
函数构建列表的性能进行了快速而简单的分析,结果时间相差28%。这听起来很惊人,但是如果你看一下数量级:每个元素大约需要230纳秒(哪种算法?我很难找到一种情况,其中该选择占主导地位)。heapq
中的nlargest()
和nsmallest()
函数最适合在你想要找到相对较少的项目时使用。如果你只想找到单个最小或最大值,那么使用min()
和max()
是最适合的,因为它更快,并使用sorted
然后切片。如果你正在查找N个最小或最大项,而且N相对于集合的总大小较小,这些函数提供了更好的性能。尽管在你的代码中使用heapq
并不是必须的,但它是一个有趣的主题和值得学习的课题。heapq
是一个以二叉堆为基础实现的工具。需要注意以下关键点,涉及到二叉堆和heapq
:
更多二叉堆信息请参考:http://en.wikipedia.org/wiki/Binary_heap
sorted
是一个不同的概念,它返回一个排好序的列表,而heapq
则是一个你需要不断使用的数据结构,可以通过sorted
进行排序。
更多sorted
信息请参考:https://docs.python.org/3.4/library/functions.html#sorted
你具体想要实现什么功能?
回复OP评论:
为什么你认为一定需要heapq
?二叉堆是一种特殊的数据结构,根据你的需求,很可能并不需要它。
你似乎非常关注性能问题,但是并不清楚为什么。如果某个东西的“性能不好”,但是其总时间不重要,那么在大局上就无所谓了。在总体情况下,dict
或list
通常都能很好地执行。你为什么认为一定需要heapq
?
我想知道这是否属于不要让完美成为敌人的好类型的情况。
使用C扩展编写Python是一种保留给真正需要性能的情况下的利基用例。(例如,如果你处理大文件并且性能是主要问题,则使用C扩展的XML解析器可能比纯Python更好)。
关于在复杂结构中保持玩耍时,使用sorted进行排序并通过.append()添加元素是否更快:
我仍然不清楚这里的用例是什么。如我上面提到的,sorted
和heapq
实际上是两个不同的概念。
你所关注的性能问题是针对什么使用场景的?(如果没有其他未指定的因素,我认为你可能过分强调了代码中最佳性能的重要性。)
max(L)
比创建堆要快得多,而且比调用sorted
更快。 - Dan RL
是一个列表,那么你可以通过L.remove(max(L))
删除最大的元素。虽然这有点浪费,因为它进行了两次遍历,而实际上只需要一次,但它仍然比构建堆要快。 - Dan R