最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年10月05日 10:11:21   作者:lincappu  
這篇文章主要介紹了Python collections.deque雙邊隊(duì)列原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

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

collections.deque

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

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

相比于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]

線程安全方面,通過查看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;
}

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

綜上,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適用于多線程的場景,asyncio.Queue適用于協(xié)程場景下的通信,由于asyncio的加成,queue.Queue下的阻塞接口在asyncio.Queue中則是以返回協(xié)程對象的方式執(zhí)行,具體差異如下表:

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

multiprocessing.Queue

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

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,通過一個(gè)feeder線程寫入底層Pipe,這樣做是為了實(shí)現(xiàn)超時(shí)控制和非阻塞put/get,所以Queue提供了join_thread、cancel_join_thread、close函數(shù)來控制feeder的行為,close函數(shù)用來關(guān)閉feeder線程、join_thread用來join feeder線程,cancel_join_thread用來在控制在進(jìn)程退出時(shí),不自動(dòng)join feeder線程,使用cancel_join_thread有可能導(dǎo)致部分?jǐn)?shù)據(jù)沒有被feeder寫入Pipe而導(dǎo)致的數(shù)據(jù)丟失。

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

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

總結(jié)

通過對比可以發(fā)現(xiàn),上述四種結(jié)構(gòu)都實(shí)現(xiàn)了隊(duì)列,但是用處卻各有偏重,collections.deque在數(shù)據(jù)結(jié)構(gòu)層面實(shí)現(xiàn)了隊(duì)列,但是并沒有應(yīng)用場景方面的支持,可以看做是一個(gè)基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。queue模塊實(shí)現(xiàn)了面向多生產(chǎn)線程、多消費(fèi)線程的隊(duì)列,asyncio.queue模塊則實(shí)現(xiàn)了面向多生產(chǎn)協(xié)程、多消費(fèi)協(xié)程的隊(duì)列,而multiprocessing.queue模塊實(shí)現(xiàn)了面向多成產(chǎn)進(jìn)程、多消費(fèi)進(jìn)程的隊(duì)列。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python爬取數(shù)據(jù)并實(shí)現(xiàn)可視化代碼解析

    Python爬取數(shù)據(jù)并實(shí)現(xiàn)可視化代碼解析

    這篇文章主要介紹了Python爬取數(shù)據(jù)并實(shí)現(xiàn)可視化代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 在Django框架中運(yùn)行Python應(yīng)用全攻略

    在Django框架中運(yùn)行Python應(yīng)用全攻略

    這篇文章主要介紹了在Django框架中運(yùn)行Python應(yīng)用全攻略,在這之前必須搭建好簡單的視圖和模版,接下來便是本文中所述的核心內(nèi)容應(yīng)用配置,需要的朋友可以參考下
    2015-07-07
  • Qt自定義Plot實(shí)現(xiàn)曲線繪制的詳細(xì)過程

    Qt自定義Plot實(shí)現(xiàn)曲線繪制的詳細(xì)過程

    這篇文章主要介紹了Qt自定義Plot實(shí)現(xiàn)曲線繪制,包含arm觸摸屏多點(diǎn)觸控縮放(只支持兩點(diǎn)),實(shí)時(shí)曲線繪制,數(shù)據(jù)點(diǎn)根據(jù)繪制寬度優(yōu)化,跟蹤點(diǎn)數(shù)據(jù)獲取,雙坐標(biāo)等功能,需要的朋友可以參考下
    2021-11-11
  • Python實(shí)用工具FuckIt.py介紹

    Python實(shí)用工具FuckIt.py介紹

    這篇文章主要介紹了Python實(shí)用工具FuckIt.py介紹,FuckIt.py 使用了最先進(jìn)的技術(shù)能夠使你的代碼不管里面有什么樣的錯(cuò)誤,你只管 FuckIt,程序就能“正?!眻?zhí)行,兵來將擋水來土掩,需要的朋友可以參考下
    2019-07-07
  • pandas中df.groupby()方法深入講解

    pandas中df.groupby()方法深入講解

    在使用pandas進(jìn)行數(shù)據(jù)統(tǒng)計(jì)分析時(shí)遇到了問題,找了很久才找到解決辦法,所以下面這篇文章主要給大家介紹了關(guān)于pandas中df.groupby()方法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 淺談python多線程和隊(duì)列管理shell程序

    淺談python多線程和隊(duì)列管理shell程序

    這篇文章主要給大家簡單介紹了python多線程和隊(duì)列管理shell程序的方法和簡單示例,有需要的小伙伴可以參考下。
    2015-08-08
  • Python中獲取文件大小的四種辦法

    Python中獲取文件大小的四種辦法

    這篇文章主要給大家介紹了關(guān)于Python中獲取文件大小的四種辦法,我們可以使用Python中的os模塊來獲取視頻文件大小,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Python映射拆分操作符用法實(shí)例

    Python映射拆分操作符用法實(shí)例

    這篇文章主要介紹了Python映射拆分操作符用法,實(shí)例分析了Python映射拆分操作符**的使用技巧,需要的朋友可以參考下
    2015-05-05
  • Python中用format函數(shù)格式化字符串的用法

    Python中用format函數(shù)格式化字符串的用法

    這篇文章主要介紹了Python中用format函數(shù)格式化字符串的用法,格式化字符串是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文主要針對Python2.7.x版本,需要的朋友可以參考下
    2015-04-04
  • python實(shí)現(xiàn)提取str字符串/json中多級(jí)目錄下的某個(gè)值

    python實(shí)現(xiàn)提取str字符串/json中多級(jí)目錄下的某個(gè)值

    今天小編就為大家分享一篇python實(shí)現(xiàn)提取str字符串/json中多級(jí)目錄下的某個(gè)值,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論

静海县| 陵水| 临武县| 旌德县| 儋州市| 枣阳市| 两当县| 达日县| 惠来县| 开平市| 肥乡县| 闽清县| 灵川县| 大兴区| 阳谷县| 丘北县| 北安市| 郑州市| 通城县| 渝北区| 隆昌县| 大方县| 祁连县| 石狮市| 宁津县| 福州市| 内丘县| 奇台县| 双牌县| 青田县| 深泽县| 贡觉县| 西乡县| 湖口县| 乐清市| 永清县| 云林县| 安康市| 海门市| 塔城市| 彰武县|