python——queue模塊

queue模塊提供了隊列這種數據結構,不必費時間自己去構建這類數據結構,比較方便。

雖然我們可以基於python中的list數據結構,使用pop(0)和append方法實現普通的隊列。但是queue模塊中提供了更豐富隊列的API,該模塊主要提供三種隊列:Queue、LifoQueue、PriorityQueue。Queue就是前面說的普通隊列,先入先出(FIFO),有最大容量;LifoQueue類似棧,後入先出(LIFO);PriorityQueue是優先隊列,也是我認爲這個模塊最重要的類。

另外,其實queue模塊還有一種類deque,即雙向隊列,方法和collections模塊的deque類相同,本文不贅述。

下面先簡要介紹一下優先隊列這種數據結構:

優先隊列

我們知道隊列是先進去的元素可以先出來(FIFO),出隊的次序完全取決於進隊時間的早晚,隊伍內部不改變數據的相對順序。但是有時候我們希望維護這樣一種數據結構,雖然進入數據有先後,但是每次取出的元素都是最大或最小的,即出隊的數據是經過排序的,是有優先級的。這就是優先隊列。python的queue模塊中,優先隊列中優先級約小越先出隊。

優先隊列通常都是通過堆來實現的,我另外一篇博文介紹了python的heapq模塊,可以實現堆這種數據結構,提到了它的一種應用就是實現優先隊列。queue模塊的優先隊列和heapq模塊實現的優先隊列的區別是:heapq模塊實現最小堆,輸入元素是包含數字的列表,通過數字大小排列優先級;queue模塊的PriorityQueue,入隊元素是tuple,優先級數字在元組中輸入,數據可以是任意類型,具體介紹見下文。

queue模塊

在python2中模塊名稱是Queue。

常用方法

因爲queue模塊中三種類的方法基本相同,所以下面僅以Queue類爲例進行介紹。PriorityQueue的put方法有點差異。

注意:這裏Queue是類的名稱,不是模塊名。

爲了方便介紹後面的方法,生成了一個隊列q。

q=queue.Queue(maxsize=0)
#初始化一個隊列,maxsize表示最大容量,若小於等於0,表示容量無限。默認爲0。
q.empty()
#若隊列空,返回True,否則False
q.full()
#若隊列滿,返回True,否則False
q.qsize()
#返回隊列實際長度,即元素數量
q.put(item, block=True, timeout=None)
#元素入隊,可以不同類型
q.put((priority number,data),block=True, timeout=None)
#對於PriorityQueue,入隊元素必須是tuple類型,其中priority number表示優先級,越小越優先,data是數據
q.get(block=True, timeout=None)
#元素出隊,對不同類的隊列,出隊方式不同

注意:put和get方法中的block默認爲True,timeout默認爲None。block爲True表示,若發生阻塞(空隊列時get,或滿隊列時put),等待timeout秒再報錯,timeout默認None表示阻塞時一直等待。block爲False表示,發生阻塞立刻拋出異常,停止程序。

示例
Queue
import queue
q=queue.Queue(5)
q.put('a')
q.put([1,2])
q.qsize()   #2
q.get()   #'a'
PriorityQueue
import queue
p=queue.PriorityQueue()
p.put((2,'a'))
p.put((1,[1,2]))
p.put((3,1))
p.get()   #(1, [1, 2])
LifoQueue
import queue
s=queue.LifoQueue()
s.put({1,2})
s.put(1)
s.put('abc')
s.qsize()   #3
s.get()   #'abc'
s.qsize()   #2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章