欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Pythoncollections.deque雙邊隊(duì)列的原理-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Python collections.deque雙邊隊(duì)列的原理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

創(chuàng)新互聯(lián)專注于中大型企業(yè)的做網(wǎng)站、網(wǎng)站設(shè)計(jì)和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開(kāi)發(fā)的融合,累計(jì)客戶數(shù)千家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開(kāi)發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!

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

在Python文檔中搜索隊(duì)列(queue)會(huì)發(fā)現(xiàn),Python標(biāo)準(zhǔn)庫(kù)中包含了四種隊(duì)列,分別是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque。

collections.deque

deque是雙端隊(duì)列(double-ended queue)的縮寫,由于兩端都能編輯,deque既可以用來(lái)實(shí)現(xiàn)棧(stack)也可以用來(lái)實(shí)現(xiàn)隊(duì)列(queue)。

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

Python collections.deque雙邊隊(duì)列的原理

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

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

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

deque還封裝了順逆時(shí)針的旋轉(zhuǎn)的方法:rotate。

# 順時(shí)針
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]

# 逆時(shí)針
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]

線程安全方面,通過(guò)查看collections.deque中的append()、pop()等方法的源碼可以知道,他們都是原子操作,所以是GIL保護(hù)下的線程安全方法。

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;
}

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

Python collections.deque雙邊隊(duì)列的原理

綜上,collections.deque是一個(gè)可以方便實(shí)現(xiàn)隊(duì)列的數(shù)據(jù)結(jié)構(gòu),具有線程安全的特性,并且有很高的性能。

queue.Queue & asyncio.Queue

queue.Queue和asyncio.Queue都是支持多生產(chǎn)者、多消費(fèi)者的隊(duì)列,基于collections.deque,他們都提供了Queue(FIFO隊(duì)列)、PriorityQueue(優(yōu)先級(jí)隊(duì)列)、LifoQueue(LIFO隊(duì)列),接口方面也相同。

區(qū)別在于queue.Queue適用于多線程的場(chǎng)景,asyncio.Queue適用于協(xié)程場(chǎng)景下的通信,由于asyncio的加成,queue.Queue下的阻塞接口在asyncio.Queue中則是以返回協(xié)程對(duì)象的方式執(zhí)行,具體差異如下表:

 queue.Queueasyncio.Queue
介紹同步隊(duì)列asyncio隊(duì)列
線程安全
超時(shí)機(jī)制通過(guò)timeout參數(shù)實(shí)現(xiàn)通過(guò)asyncio.wait_for()方法實(shí)現(xiàn)
qsize()預(yù)估的隊(duì)列長(zhǎng)度(獲取qsize到下一個(gè)操作之間,queue有可能被其它的線程修改,導(dǎo)致qsize大小發(fā)生變化)準(zhǔn)確的隊(duì)列長(zhǎng)度(由于是單線程,所以queue不會(huì)被其它線程修改)
put() / set()put(item, block=True, timeout=None),可以通過(guò)設(shè)置block是否為True來(lái)配置put和set方法是否為阻塞,并且可以為阻塞操作設(shè)置大時(shí)長(zhǎng)timeout,block為False時(shí)行為和put_nowait()方法一致。put()方法會(huì)返回一個(gè)協(xié)程對(duì)象,所以沒(méi)有block參數(shù)和timeout參數(shù),如果需要非阻塞方法,可以使用put_nowait(),如果需要對(duì)阻塞方法應(yīng)用超時(shí),可以使用coroutine asyncio.wait_for()。

multiprocessing.Queue

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

Python collections.deque雙邊隊(duì)列的原理

multiprocessing.Queue既是線程安全也是進(jìn)程安全的,相當(dāng)于queue.Queue的多進(jìn)程克隆版。和threading.Queue很像,multiprocessing.Queue支持put和get操作,底層結(jié)構(gòu)是multiprocessing.Pipe。

multiprocessing.Queue底層是基于Pipe構(gòu)建的,但是數(shù)據(jù)傳遞時(shí)并不是直接寫入Pipe,而是寫入進(jìn)程本地buffer,通過(guò)一個(gè)feeder線程寫入底層Pipe,這樣做是為了實(shí)現(xiàn)超時(shí)控制和非阻塞put/get,所以Queue提供了join_thread、cancel_join_thread、close函數(shù)來(lái)控制feeder的行為,close函數(shù)用來(lái)關(guān)閉feeder線程、join_thread用來(lái)join feeder線程,cancel_join_thread用來(lái)在控制在進(jìn)程退出時(shí),不自動(dòng)join feeder線程,使用cancel_join_thread有可能導(dǎo)致部分?jǐn)?shù)據(jù)沒(méi)有被feeder寫入Pipe而導(dǎo)致的數(shù)據(jù)丟失。

和threading.Queue不同的是,multiprocessing.Queue默認(rèn)不支持join()和task_done操作,這兩個(gè)支持需要使用mp.JoinableQueue對(duì)象。

SimpleQueue是一個(gè)簡(jiǎn)化的隊(duì)列,去掉了Queue中的buffer,沒(méi)有了使用Queue可能出現(xiàn)的問(wèn)題,但是put和get方法都是阻塞的并且沒(méi)有超時(shí)控制。

關(guān)于Python collections.deque雙邊隊(duì)列的原理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

本文題目:Pythoncollections.deque雙邊隊(duì)列的原理-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://aaarwkj.com/article44/ihghe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司網(wǎng)站設(shè)計(jì)、服務(wù)器托管、建站公司、移動(dòng)網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
91麻豆亚洲国产成人久久| 亚洲无综合素人在线观看| 国产亚洲精品视频在线网| 久久99热这里只频精品| 黑寡妇精品欧美一区二区毛| 日韩中文字幕久久中文字幕| 国产一级黄色录像大片| 国产精品综合日韩精| 精品国产av色一区二区| 亚洲精品亚洲一区亚洲二区| 日韩精品91一区二区| 中文字幕日韩高清乱码| 久草福利资源在线观看视频| 国产高清学生三级一区二区| 91性感视频在线播放| 欧美日韩在线不卡成人| 在线视频日韩欧美国产二区| 亚洲av毛片免费在线| 99精品国产综合久久麻豆| 麻豆精品新av中文字幕| 欧美 日韩一区二区在线| 超碰av之男人的天堂| 久久香蕉国产线看观看亚洲| 欧美午夜福利视频电影| 日韩在线不卡一二三| 国产一区二区三区午夜视频| 亚洲精品国产精品粉嫩| 国产精品呻吟久久人妻| 丰满人妻被黑人猛烈进入| 国产精品传媒免费在线观看| 人妻在线中文字幕一区| 亚洲欧美日韩香蕉在线观看| 国产女主播在线观看免费观看| 欧美黄色免费电影网站| 日韩久久精品国产亚洲av成人| 国产精品亚洲精品日韩在线| 国产原创剧情免费观看av| 真人国产一级美女免费视频| 亚洲国产日韩伦中文字幕| 97视频在线观看网站| 中国一区二区三区毛片|