Python?循環(huán)緩沖區(qū)
循環(huán)緩沖區(qū)是環(huán)形緩沖區(qū)的另一個(gè)名稱。 緩沖區(qū)是一種數(shù)據(jù)結(jié)構(gòu),它使用單個(gè)固定大小的緩沖區(qū),就好像它是端到端連接的一樣。
這種結(jié)構(gòu)有助于管理數(shù)據(jù)流,其中可以在一端不斷添加新數(shù)據(jù),而可以從另一端刪除舊數(shù)據(jù)。 當(dāng)緩沖區(qū)已滿時(shí),新數(shù)據(jù)將覆蓋最舊的數(shù)據(jù)。
Python 中的高效循環(huán)緩沖區(qū)
高效的循環(huán)緩沖區(qū)是一種允許高效插入和刪除數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
循環(huán)緩沖區(qū)通常作為數(shù)組實(shí)現(xiàn)。 數(shù)組頭指針指向第一個(gè)元素,尾指針指向數(shù)組中的最后一個(gè)元素。
頭指針和尾指針在到達(dá)數(shù)組末尾時(shí)回繞。 插入循環(huán)緩沖區(qū)是通過遞增頭指針并將數(shù)據(jù)寫入該位置的數(shù)組來完成的。
從循環(huán)緩沖區(qū)中刪除是通過遞增尾指針來完成的。 該數(shù)據(jù)并未從數(shù)組中刪除,但頭指針和尾指針有效地跳過了它。
循環(huán)緩沖區(qū)是一種高效的數(shù)據(jù)結(jié)構(gòu),因?yàn)樗恍枰潭〝?shù)量的內(nèi)存。 它也很容易實(shí)現(xiàn)。
class Buffer: def __init__(self, size): self.data = [None for i in range(size)] def append(self, x): self.data.pop(0) self.data.append(x) def get(self): return self.data buf = Buffer(4) for i in range(10): buf.append(i) print(buf.get())
輸出:
[None, None, None, 0]
[None, None, 0, 1]
[None, 0, 1, 2]
[0, 1, 2, 3]
[1, 2, 3, 4]
[2, 3, 4, 5]
[3, 4, 5, 6]
[4, 5, 6, 7]
[5, 6, 7, 8]
[6, 7, 8, 9]
在 Python 中實(shí)現(xiàn)循環(huán)緩沖區(qū)
在 Python 中有很多方法可以實(shí)現(xiàn)高效的循環(huán)緩沖區(qū)。 一種常見的方法是使用 collections.dequeue 對象,該對象旨在有效地支持從隊(duì)列的前端和后端移除和添加元素。
另一種方法是使用列表并分別跟蹤頭部和尾部索引。
如果您想知道哪種方法最好,則取決于應(yīng)用程序的具體要求。 例如,如果元素需要頻繁地從緩沖區(qū)中添加和刪除,并且順序不是必需的,那么出列方法可能是最好的。
另一方面,如果元素只被添加到緩沖區(qū)一次然后多次讀出,或者如果順序是必要的,那么列表方法可能更好。
在 Python 中使用 collections.enqueue 和 collections.dequeue 實(shí)現(xiàn)循環(huán)隊(duì)列
首先,我們將使用函數(shù) collections.enqueue
在隊(duì)列中添加值。 然后,我們可以在循環(huán)隊(duì)列中使用 collection.dequeue 從隊(duì)列中刪除一個(gè)元素。
為了理解它的工作原理,讓我們看一下 Python 中循環(huán)隊(duì)列的實(shí)際例子。
示例代碼:
# implememting circular queue in python class CircularQueue(): def __init__(collections, k): collections.k = k collections.queue = [None] * k collections.head = collections.tail = -1 # this function will insert (Enqueue) an element into the circular queue def enqueue1(collections, data): if ((collections.tail + 1) % collections.k == collections.head): print("The queue is full\n") elif (collections.head == -1): collections.head = 0 collections.tail = 0 collections.queue[collections.tail] = data else: collections.tail = (collections.tail + 1) % collections.k collections.queue[collections.tail] = data # this function will delete (dequeue) an element from the circular def dequeue1(collections): if (collections.head == -1): print("The circular queue is empty\n") elif (collections.head == collections.tail): temp = collections.queue[collections.head] collections.head = -1 collections.tail = -1 return temp else: temp = collections.queue[collections.head] collections.head = (collections.head + 1) % collections.k return temp # This function is used to print the queue def printCQueue1(collections): if(collections.head == -1): print("Circular queue is empty") elif (collections.tail >= collections.head): for i in range(collections.head, collections.tail + 1): print(collections.queue[i], end=" ") print() else: for i in range(collections.head, collections.k): print(collections.queue[i], end=" ") for i in range(0, collections.tail + 1): print(collections.queue[i], end=" ") print() obj = CircularQueue(5) # adding data to the queue for i in range(1, 6): obj.enqueue1(i) print("Display queue") obj.printCQueue1() # removing data from the queue print("\nDelete Value:", obj.dequeue1()) print("Delete Value:", obj.dequeue1()) print("\nTwo values were deleted from the queue") print("The new queue has 3 values now") obj.printCQueue1()
輸出:
Display queue
1 2 3 4 5Delete Value: 1
Delete Value: 2Two values were deleted from the queue
The new queue has 3 values now
3 4 5
Python循環(huán)緩沖區(qū)的優(yōu)點(diǎn)
在 Python 中處理數(shù)據(jù)時(shí)使用循環(huán)緩沖區(qū)有很多優(yōu)點(diǎn)。
- 一個(gè)優(yōu)點(diǎn)是它可以用于以先進(jìn)先出 (FIFO) 方式存儲數(shù)據(jù)。 當(dāng)您需要按照接收數(shù)據(jù)的原始順序處理數(shù)據(jù)時(shí),這會有所幫助。
- 另一個(gè)優(yōu)點(diǎn)是循環(huán)緩沖區(qū)可以以后進(jìn)先出 (LIFO) 的方式存儲數(shù)據(jù)。 當(dāng)您需要以接收數(shù)據(jù)的相反順序處理數(shù)據(jù)時(shí),這會很好。
- 此外,循環(huán)緩沖區(qū)可用于以隨機(jī)訪問方式存儲數(shù)據(jù)。 當(dāng)您需要快速隨機(jī)訪問數(shù)據(jù)時(shí),這會很有幫助。
Python循環(huán)緩沖區(qū)的缺點(diǎn)
在 Python 中使用循環(huán)緩沖區(qū)有一些缺點(diǎn)。
- 首先,不可能隨機(jī)訪問緩沖區(qū)中的元素。 這可能會導(dǎo)致難以處理非線性順序的數(shù)據(jù)。
- 其次,緩沖區(qū)的大小是固定的。 如果您需要存儲的數(shù)據(jù)多于緩沖區(qū)可以容納的數(shù)據(jù),這可能會導(dǎo)致問題。
- 最后,循環(huán)緩沖區(qū)比其他數(shù)據(jù)結(jié)構(gòu)更難調(diào)試。
總結(jié)
Python 循環(huán)緩沖區(qū)是一種快速高效的數(shù)據(jù)存儲方式。 循環(huán)數(shù)據(jù)緩沖區(qū)是一個(gè)隊(duì)列,可以用作容納單個(gè)對象的容器。
當(dāng)不斷添加和刪除數(shù)據(jù)時(shí),例如在視頻游戲或音頻處理中,通常會使用循環(huán)緩沖區(qū)。 它可以用單個(gè)指針實(shí)現(xiàn),而線性隊(duì)列需要兩個(gè)指針。
循環(huán)緩沖區(qū)可以很容易地?cái)U(kuò)展到多個(gè)隊(duì)列,允許并發(fā)數(shù)據(jù)訪問。
到此這篇關(guān)于Python 循環(huán)緩沖區(qū)的文章就介紹到這了,更多相關(guān)Python 循環(huán)緩沖區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中l(wèi)ist循環(huán)語句用法實(shí)例
這篇文章主要介紹了python中l(wèi)ist循環(huán)語句用法,以實(shí)例形式詳細(xì)介紹了Python針對list的解析,包含各種常見的遍歷操作及原理分析,需要的朋友可以參考下2014-11-11pytorch+lstm實(shí)現(xiàn)的pos示例
今天小編就為大家分享一篇pytorch+lstm實(shí)現(xiàn)的pos示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python 導(dǎo)入數(shù)據(jù)及作圖的實(shí)現(xiàn)
今天小編就為大家分享一篇python 導(dǎo)入數(shù)據(jù)及作圖的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python函數(shù)式編程之面向過程面向?qū)ο蠹昂瘮?shù)式簡析
這一番我們要學(xué)習(xí)點(diǎn)有難度的了,因此將降低閱讀與理解難度,盡量采用大白話為你鋪墊,因?yàn)樯婕暗囊恍└拍钜彩墙梃b的其它編程語言的風(fēng)格,而且實(shí)際落地中存在部分爭議不過多學(xué)一點(diǎn),總是沒有壞處的2021-09-09利用Python腳本寫端口掃描器socket,python-nmap
這篇文章主要介紹了利用Python腳本寫端口掃描器socket,python-nmap,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07Python類中使用cursor.execute()時(shí)語法錯(cuò)誤的解決方法
在 Python 類中使用 cursor.execute() 時(shí),出現(xiàn)語法錯(cuò)誤(如 SyntaxError 或 SQL 語法相關(guān)錯(cuò)誤)通常是因?yàn)?nbsp;SQL 語句格式不正確、占位符使用不當(dāng),或參數(shù)傳遞方式不符合預(yù)期,以下是解決此類問題的常見方法和建議,需要的朋友可以參考下2024-09-09