python利用优先队列取最大K个元素

利用priorityqueue取最大的K个元素

在进行稍微大一点的数据排序时, 有时并不需要全部数据, 只需要前面的最大k个数, 如果用sorted([…])[::-1][:k]实现效率会低很多, 为了优化执行速度, 可以采用优先队列priorityqueue实现求最大的K个元素. 同时空间也可以得到明显优化

import queue
import random

K = 12
q = queue.PriorityQueue()
tlist = []

for ith in range(100):
    q.put((ith, ith + random.randrange(100)))
    if q.qsize() > K: q.get() # pop least item
        
while not q.empty():
    tnum = q.get()
    tlist.append(tnum)

tlist.sort(reverse=True)
print(tlist)
效果
[(99, 187), (98, 152), (97, 184), (96, 136), 
(95, 105), (94, 119), (93, 109), (92, 169), 
(91, 149), (90, 143), (89, 91), (88, 92)]

priorityqueue是在queue包里, 而queue里priorityqueue的实现是调用的headq里小顶堆的实现, 所以没有提供key参数改变优先队列的排序比较规则, 就只有从小到大升序排列, 所以为了取前K大元素, 需要在队列规模大于K时弹出队首元素, 维持最大的K个在队列里, 最后再用一个list承接队列里的元素, 再降序排序一次就得到目标结果.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值