파이썬 API 둘러보기

queue.PriorityQueue

queue 모듈은 synchronized, 즉 thread-safe이다. threading 모듈과 함께 쓰면 되겠다.

Qeuue, LifoQueue, PriorityQueue, SimpleQueue 클래스가 있다.

 

동기화 옵션을 제외하면 get(), put(), size(), full(), empty()로 간단히 쓸 수 있다.

 

다만 PriorityQueue 는 쓰기 꽤 까다롭다.

>>> from queue import PriorityQueue
>>> q =PriorityQueue()
>>> q.queue
[]
>>> q.empty()
True

>>> q.put(1)
>>> q.put(0)
>>> q.queue
[0, 1]

>>> q.qsize()
2

>>> q.get()
0
>>> q.queue
[1]

 

  • heapq로 구현되었다. 사실상 heapq의 래퍼이지, multi-level queue는 아니다.
  • 우선순위(key)와 값(value)를 구분하지 않으므로 (k1, k2,..., v) 처럼 만들어 사용했다.
  • minheap이기 때문에 작은 값이 먼저 나온다. 높은 거부터 얻으려면 우선순위를 역전시켜야 한다.
from queue import PriorityQueue


q = PriorityQueue()
d = {'a':1, 'b':1, 'c':2}

q.put((-d['a'], 'a'))
q.put((-d['b'], 'b'))
q.put((-d['c'], 'c'))

keyval = lambda x: (x[1], -x[0])
print(keyval(q.get()))
print(keyval(q.get()))
print(keyval(q.get()))

결과:

('c', 2)
('a', 1)
('b', 1)

 

힙이기 때문에 stable하지 않다.

위 예에서 'a'가 먼저 나올지, 'b'가 먼저 나올지는 'a'와 'b'의 사전 순서에 달려 있다.

이는 의도한 바가 아니므로,

두 번째 키로 일련번호를 붙여서 'a':1 과 'b':1 중 먼저 들어간 게 먼저 나오게 하면

논리적으로 multi-level queue가 된다.

from queue import PriorityQueue


q = PriorityQueue()
d = {'a':1, 'b':1, 'c':2}
seq = 0

q.put((-d['a'], seq, 'a')); seq += 1
q.put((-d['b'], seq, 'b')); seq += 1
q.put((-d['c'], seq, 'c')); seq += 1

keyval = lambda x: (x[2], -x[0])
print(keyval(q.get()))
print(keyval(q.get()))
print(keyval(q.get()))

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
장과장02
현재 버전
선택 버전
graphittie 자세히 보기