欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python collections中的雙向隊列deque簡單介紹詳解

 更新時間:2019年11月04日 14:29:06   作者:洛的城  
這篇文章主要介紹了Python collections中的雙向隊列deque簡單介紹詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在python神書《Python+Cookbook》中有這么一段話:在隊列兩端插入或刪除元素時間復(fù)雜度都是 O(1) ,而在列表的開頭插入或刪除元素的時間復(fù)雜度為 O(N)。
于是就想驗證下。

簡單使用

基本代碼

from collections import deque
q = deque(maxlen=4)#有固定長度的雙向隊列
qq = deque() #無固定長度
print(dir(q))#看看有哪些可用方法或?qū)傩?

結(jié)果:

['__add__', '__bool__', '__class__', '__contains__', '__copy__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'appendleft', 'clear', 'copy', 'count', 'extend', 'extendleft', 'index', 'insert', 'maxlen', 'pop', 'popleft', 'remove', 'reverse', 'rotate']

看到可以append,pop,insert,clear等,還可以像List一樣用中括號 [] 對某個index獲取或設(shè)置值。因為是雙向隊列,所以也有左操作函數(shù):appendleft,popleft。額外的還要反轉(zhuǎn)函數(shù)reverse,計數(shù)函數(shù)count。

使用ipython驗證

In [1]: from collections import deque
…: q = deque(maxlen=4)#有固定長度的雙向隊列
…: qq = deque() #無固定長度
…: print(dir(q))#看看有哪些可用方法或?qū)傩?
[‘a(chǎn)dd', ‘bool', ‘class', ‘contains', ‘copy', ‘delattr', ‘delitem', ‘dir', ‘doc', ‘eq', ‘format', ‘ge', ‘getattribute', ‘getitem', ‘gt', ‘hash', ‘iadd', ‘imul', ‘init', ‘init_subclass', ‘iter', ‘le', ‘len', ‘lt', ‘mul', ‘ne', ‘new', ‘reduce', ‘reduce_ex', ‘repr', ‘reversed', ‘rmul', ‘setattr', ‘setitem', ‘sizeof', ‘str', ‘subclasshook', ‘a(chǎn)ppend', ‘a(chǎn)ppendleft', ‘clear', ‘copy', ‘count', ‘extend', ‘extendleft', ‘index', ‘insert', ‘maxlen', ‘pop', ‘popleft', ‘remove', ‘reverse', ‘rotate']
In [2]: q
Out[2]: deque([])
In [3]: q.append(1)
In [4]: q.insert(0,33)
In [6]: q
Out[6]: deque([33, 1])
In [8]: q.appendleft(44)
In [9]: q
Out[9]: deque([44, 33, 1])
In [10]: q.pop()
Out[10]: 1
In [12]: q[1]
Out[12]: 33
In [13]: q
Out[13]: deque([44, 33])
In [14]: q.reverse()
In [15]: q
Out[15]: deque([33, 44])
In [17]: q.clear()
In [18]: q
Out[18]: deque([])

性能測試

pop和append

#coding:utf8
import datetime,time
from collections import deque
D = deque()
L=[]
def calcTime(func):  
  def doCalcTime():
    sst = int(time.time()*1000)
    func()
    eed = int(time.time()*1000)
    print(func,'cost time:',eed-sst,'ms')
  return doCalcTime

@calcTime
def didDeque():
  for i in range(0,10000000):
    D.append(i)
  while D:
    D.pop()

@calcTime
def didList():
  for i in range(0,10000000):
    L.append(i)
  while L:
    L.pop()
    
if __name__=='__main__':
  didDeque()
  print("------------")
  didList()

運行結(jié)果:

<function didDeque at 0x000002D6912A4D08> cost time: 1924 ms
------------
<function didList at 0x000002D6912D4048> cost time: 2420 ms

是快了一些。

insert

#coding:utf8
import datetime,time
from collections import deque
D = deque()
L=[]
def calcTime(func):  
  def doCalcTime():
    sst = int(time.time()*1000)
    func()
    eed = int(time.time()*1000)
    print(func,'cost time:',eed-sst,'ms')
  return doCalcTime

@calcTime
def didDeque():
  for i in range(0,100000):
    D.insert(5,i)
    
@calcTime
def didList():
  for i in range(0,100000):
    L.insert(5,i)

if __name__=='__main__':
  didDeque()
  print("------------")
  didList()

運行結(jié)果:

<function didDeque at 0x0000021367F06D08> cost time: 32 ms
------------
<function didList at 0x0000021367F34048> cost time: 3499 ms

快了兩個數(shù)量級。想想也明白,一個是鏈表,插入的時候只需要改變指針指向,而List是連續(xù)空間,需要移動一大堆的元素。

計算移動平均

>>> import numpy as np
>>> from collections import deque
>>> q=deque(maxlen=5)
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q.append(4)
>>> q.append(5)
>>> q.append(6)
>>> q
deque([2, 3, 4, 5, 6], maxlen=5)
>>> np.array(q).mean()
4.0

結(jié)語

如果可以,數(shù)據(jù)量大的時候,用deque代替List的能提升一部分性能。 而由于deque是隊列可以設(shè)定固定長度,實現(xiàn)先入先出。 那么,如在計算移動平均的時候可以使用,很快捷方便。

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

相關(guān)文章

  • Python機器學習NLP自然語言處理基本操作精確分詞

    Python機器學習NLP自然語言處理基本操作精確分詞

    本文是Python機器學習NLP自然語言處理系列文章,帶大家開啟一段學習自然語言處理 (NLP) 的旅程. 本文主要學習NLP自然語言處理基本操作之如何精確分詞
    2021-09-09
  • Python畫圖時如何調(diào)用本地字體

    Python畫圖時如何調(diào)用本地字體

    這篇文章主要為大家介紹在通過Python繪制圖畫時如何調(diào)用本地的字體,從而解決中文亂碼的問題。感興趣的小伙伴快來跟隨小編學習學習吧
    2021-12-12
  • Python 正則表達式的高級用法

    Python 正則表達式的高級用法

    作為一個概念而言,正則表達式對于Python來說并不是獨有的。但是,Python中的正則表達式在實際使用過程中還是有一些細小的差別。本文是一系列關(guān)于Python正則表達式文章的其中一部分。
    2016-12-12
  • Python文件操作和異常處理的方法和技巧

    Python文件操作和異常處理的方法和技巧

    本文介紹了Python文件操作和異常處理的方法和技巧,包括讀寫文本文件、讀寫二進制文件、文件指針、異常類型和處理、try-except語句、異常處理程序等內(nèi)容,幫助讀者更好地掌握Python在文件操作和異常處理方面的應(yīng)用
    2023-05-05
  • Python中變量的輸入輸出實例代碼詳解

    Python中變量的輸入輸出實例代碼詳解

    這篇文章主要介紹了Python中變量的輸入輸出問題,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-07-07
  • python3使用QQ郵箱發(fā)送郵件

    python3使用QQ郵箱發(fā)送郵件

    這篇文章主要為大家詳細介紹了python3使用QQ郵箱發(fā)郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python中的bytes類型用法及實例分享

    Python中的bytes類型用法及實例分享

    這篇文章主要介紹了Python中的bytes類型及其用法,Python?bytes?類型用來表示一個字節(jié)串,bytes?只負責以字節(jié)序列的形式來存儲數(shù)據(jù),下面對其的相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-03-03
  • Python創(chuàng)建字典的八種方式

    Python創(chuàng)建字典的八種方式

    今天小編就為大家分享一篇關(guān)于Python創(chuàng)建字典的八種方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • PyCharm控制臺堆棧亂碼問題解決方案

    PyCharm控制臺堆棧亂碼問題解決方案

    PyCharm環(huán)境都已經(jīng)配置成了UTF-8編碼,控制臺打印中文也不會出現(xiàn)亂碼,但報錯堆棧信息中如果有中文會出現(xiàn)中文亂碼,遇到這樣的問題如何解決呢,下面小編給大家?guī)砹薖yCharm控制臺堆棧亂碼問題解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • Python?operator模塊的使用詳解

    Python?operator模塊的使用詳解

    本文主要介紹了Python?operator模塊的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>
    2023-06-06

最新評論