class queue.PriorityQueue(maxsize=0)

优先级队列构造函数。 maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大

最小值先被取出( 最小值条目是由 sorted(list(entries))[0] 返回的条目)。条目的典型模式是一个以下形式的元组: (priority_number, data) 。

如果 data 元素没有可比性,数据将被包装在一个类中,忽略数据值,仅仅比较优先级数字 :

1 from dataclasses import dataclass, field
2 from typing import Any
3 
4 @dataclass(order=True)
5 class PrioritizedItem:
6     priority: int
7     item: Any=field(compare=False)

Queue对象

队列对象 (QueueLifoQueue, 或者 PriorityQueue) 提供下列描述的公共方法。

)

返回队列的大致大小。注意,qsize() > 0 不保证后续的 get() 不被阻塞,qsize() < maxsize 也不保证 put() 不被阻塞。

)

如果队列为空,返回 True ,否则返回 False 。如果 empty() 返回 True ,不保证后续调用的 put() 不被阻塞。类似的,如果 empty() 返回 False ,也不保证后续调用的 get() 不被阻塞。

)

如果队列是满的返回 True ,否则返回 False 。如果 full() 返回 True 不保证后续调用的 get() 不被阻塞。类似的,如果 full() 返回 False 也不保证后续调用的 put() 不被阻塞。

)

将 item 放入队列。如果可选参数 block 是 true 并且 timeout 是 None (默认),则在必要时阻塞至有空闲插槽可用。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。反之 (block 是 false),如果空闲插槽立即可用,则把 item 放入队列,否则引发 Full 异常 ( 在这种情况下,timeout 将被忽略)。

)

相当于 put(item, False) 。

)

从队列中移除并返回一个项目。如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。

POSIX系统3.0之前,以及所有版本的Windows系统中,如果 block 是 true 并且 timeout 是 None , 这个操作将进入基础锁的不间断等待。这意味着,没有异常能发生,尤其是 SIGINT 将不会触发 KeyboardInterrupt 异常。

)

相当于 get(False) 。

提供了两个方法,用于支持跟踪 排队的任务 是否 被守护的消费者线程 完整的处理。

)

表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。

如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。

如果被调用的次数多于放入队列中的项目数量,将引发 ValueError 异常 。

)

阻塞至队列中所有的元素都被接收和处理完毕。

当条目添加到队列的时候,未完成任务的计数就会增加。每当消费者线程调用 task_done() 表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。当未完成计数降到零的时候, join() 阻塞被解除。

如何等待排队的任务被完成的示例:

 1 def worker():
 2     while True:
 3         item = q.get()
 4         if item is None:
 5             break
 6         do_work(item)
 7         q.task_done()
 8 
 9 q = queue.Queue()
10 threads = []
11 for i in range(num_worker_threads):
12     t = threading.Thread(target=worker)
13     t.start()
14     threads.append(t)
15 
16 for item in source():
17     q.put(item)
18 
19 # block until all tasks are done
20 q.join()
21 
22 # stop workers
23 for i in range(num_worker_threads):
24     q.put(None)
25 for t in threads:
26     t.join()

 

一道leetcode题目:

347. Top K Frequent Elements   前K个高频元素

给定一个非空的整数数组,返回其中出现频率前 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

说明:

  • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log n) , 是数组的大小。
 1 class Solution:
 2     def topKFrequent(self, nums, k: int):
 3         if k<0 or k>len(nums): return []
 4         from queue import PriorityQueue
 5         from collections import defaultdict
 6         queue = PriorityQueue()
 7         d = defaultdict(int)
 8         res = []
 9         for i in nums:
10             d[i]+=1
11         d = list(d.items())
12         print(d)
13         for i in range(len(d)):
14             queue.put([-d[i][1],d[i][0]])
15         for i in range(k):
16             res.append(queue.get()[1])
17         return res

 

参考自 Python 标准库

相关文章:

  • 2022-12-23
  • 2021-11-04
  • 2021-09-09
  • 2021-08-20
  • 2021-08-05
  • 2021-09-07
猜你喜欢
  • 2022-12-23
  • 2021-09-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案