国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解Python中的四種隊列

2020-02-23 00:10:23
字體:
來源:轉載
供稿:網友

隊列是一種只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。

在Python文檔中搜索隊列(queue)會發現,Python標準庫中包含了四種隊列,分別是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque。

collections.deque

deque是雙端隊列(double-ended queue)的縮寫,由于兩端都能編輯,deque既可以用來實現棧(stack)也可以用來實現隊列(queue)。

deque支持豐富的操作方法,主要方法如圖:

 

相比于list實現的隊列,deque實現擁有更低的時間和空間復雜度。list實現在出隊(pop)和插入(insert)時的空間復雜度大約為O(n),deque在出隊(pop)和入隊(append)時的時間復雜度是O(1)。

deque也支持in操作符,可以使用如下寫法:

q = collections.deque([1, 2, 3, 4])print(5 in q) # Falseprint(1 in q) # True

deque還封裝了順逆時針的旋轉的方法:rotate。

# 順時針q = collections.deque([1, 2, 3, 4])q.rotate(1)print(q) # [4, 1, 2, 3]q.rotate(1)print(q) # [3, 4, 1, 2]# 逆時針q = collections.deque([1, 2, 3, 4])q.rotate(-1)print(q) # [2, 3, 4, 1]q.rotate(-1)print(q) # [3, 4, 1, 2]

線程安全方面,collections.deque中的append()、pop()等方法都是原子操作,所以是GIL保護下的線程安全方法。

static PyObject *deque_append(dequeobject *deque, PyObject *item) {  Py_INCREF(item); if (deque_append_internal(deque, item, deque->maxlen) < 0)  return NULL; Py_RETURN_NONE;}

通過dis方法可以看到,append是原子操作(一行字節碼)。

 

綜上,collections.deque是一個可以方便實現隊列的數據結構,具有線程安全的特性,并且有很高的性能。

queue.Queue & asyncio.Queue

queue.Queue和asyncio.Queue都是支持多生產者、多消費者的隊列,基于collections.deque,他們都提供了Queue(FIFO隊列)、PriorityQueue(優先級隊列)、LifoQueue(LIFO隊列),接口方面也相同。

區別在于queue.Queue適用于多線程的場景,asyncio.Queue適用于協程場景下的通信,由于asyncio的加成,queue.Queue下的阻塞接口在asyncio.Queue中則是以返回協程對象的方式執行,具體差異如下表:

multiprocessing.Queue

multiprocessing提供了三種隊列,分別是Queue、SimpleQueue、JoinableQueue。

 

multiprocessing.Queue既是線程安全也是進程安全的,相當于queue.Queue的多進程克隆版。和threading.Queue很像,multiprocessing.Queue支持put和get操作,底層結構是multiprocessing.Pipe。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 古浪县| 元谋县| 荥经县| 突泉县| 阳西县| 莎车县| 尼勒克县| 大洼县| 旬阳县| 平遥县| 通渭县| 叶城县| 江源县| 阿坝县| 侯马市| 建宁县| 浙江省| 娄底市| 莒南县| 延吉市| 赞皇县| 广河县| 汶上县| 阿拉善左旗| 高要市| 新巴尔虎右旗| 黔西| 卢湾区| 藁城市| 横峰县| 雅安市| 黄石市| 宜宾市| 泸西县| 定结县| 固镇县| 新兴县| 南投市| 漳平市| 贺州市| 银川市|