您的位置:首页 > 科技 > IT业 > 宁波网站制作企业_发卡网站搭建教程_如何宣传推广自己的产品_网站及推广

宁波网站制作企业_发卡网站搭建教程_如何宣传推广自己的产品_网站及推广

2025/7/16 3:44:34 来源:https://blog.csdn.net/weixin_52297428/article/details/147077920  浏览:    关键词:宁波网站制作企业_发卡网站搭建教程_如何宣传推广自己的产品_网站及推广
宁波网站制作企业_发卡网站搭建教程_如何宣传推广自己的产品_网站及推广

任务

你需要从一个给定的序列中获取一些最小的元素。可以将序列排序,然后使用seq[:n]但还有没有更好的办法呢?

解决方案

如果需要的元素数目n远小于序列的长度,也许还能做得更好。sort是很快的,但它的时间复杂度仍然是 O(nlogn),但如果n很小,我们获取前n个最小元素的时间是 O(n)。下面给出一个简单可行的生成器,在 Python2.3 和2.4 中都同样有效:

import heapq
def isorted(data):data = list(data)heapq.heapify(data)while data:yield heapq.heappop(data)

在 Python 2.4中,如果事先知道 n,还有更简单和更快的方法从 data 中获取前n个最小的元素:

import heapq
def smallest(n,data):return heapq.nsmallest(n,data)

讨论

data 可能是任何有边界的可迭代对象,解决方案中的 isorted 函数通过调用 list 来确保它是序列。也可以删掉 data = list(data)这一行,假如下列条件满足的话:你知道 data 是一个序列,你并不关心生成器是否重新排列了 data的元素,而且需要在获取的同时从 data中删除元素。

如同5.7节所示,Python标准库提供了heapq模块,它支持人们熟知的数据结构——堆。解决方案中的 isorted 先创建了一个堆(通过 heap.heapify),然后在每一步获取元素的时候(通过 heap.heappop),生成并删除堆中最小的元素。

在 Python 2.4中,heapq模块引入了两个新函数。heapq.nlargest(n,data)返回的是一个长度为n的 data 中最大的元素的列表,heapq.nsmallest(n,data)则返回一个包含前n个最小元素的列表。这些函数并不要求 data 满足堆的条件,它们甚至不要求 data 是一个列表——任何有边界的、元素是可以比较的可选代对象都适用。解决方案中的函数 smallest 除了调用heapq.smallest,其实什么也没干。

关于速度,我们总是应该进行实际测量,猜测不同代码片段的相对运行速度是毫无意义的行为。因此,当我们只是循环获取前几个(最小)元素的时候,isorted的性能和Python 2.4 内建的 sorted 函数的性能比起来究竟怎么样呢?为了进行测试,写了一个top10函数,它可以调用这两种方法,然后我也为 Python 2.3 实现了一个 sorted 函数,因为在 Python 2.3中此函数并未得到原生的支持:

try:sorted
except:def sorted(data):data = list(data)data.sort()return data
import itertoolsdef top10(data,howtosort):return list(itertools.islice(howtosort(data),10))

在我的计算机上,在 Python 2.4中处理一个洗过牌的1000个整数的列表,top10调用isorted 耗时 260us,但采用内建的 sorted 则耗时 850us。而 Python 2.3 甚至还要慢得多:isorted耗时12ms,sorted耗时 2.7ms。换句话说,Python 2.3的sorted 比Python 2.4 的sorted要慢3倍,但在isorted上则要慢50倍。需要记住这个重要的经验:当需要进行优化时,首先进行测量。不应该仅仅根据基本原理选择优化的方式,因为真实的性能数据变化多端,即使在两个兼容的发行版本之间也会有很大的差异。第二个经验是:如果真的很关心性能,那赶紧转移到Python2.4吧。和 Python 2.3相比,Python 2.4 经过了极大的优化和加速,特别是在搜索和排序的方面。

如果确定你的代码只需要支持 Python 2.4,那么,如同本节解决方案所建议的那样,应当使用 heapq 的新函数 nsmallest。它速度快、使用简便,远胜于自己编写代码。举个例子,实现 Python 2.4 中的 top10,你只需要:

import heapq
def top10(data):return heapq.nsmallest(10,data)

比起前面展示的那个基于 isorted 的top10,对同样的洗过牌的1000个整数的列表进行处理,消耗的时间还可以削减一半。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com