********************==deque****************************************=
強化學習的experience replay 模組, 之前考慮到執行的速度,我一直用numpy陣列實現,但用起來並不方便,**也不簡潔。用deque必然方便多了,但執行速度怎樣?試過才知道。
from collections import deque
import time
d = deque(maxlen=1000000)
print d
d.extend([1,2,3])
print d
d.rotate(1)
print d
print d.count(1)
d.remove(2)
print d
d.pop()
print d
簡單記錄deque的主要操作,都很直觀的。remove()方法會從左至右丟棄第乙個匹配的物件。extend()方法可以新增乙個序列(用list包裝),rotate(1)方法類似於把佇列中所有元素的序號+1
值得注意的是:和使用陣列一樣,可以使用d[0]方法讀取和更改佇列中元素的值。
from collections import deque
import time
d = deque(maxlen=1000000)
print d[0]
d[0] = '666'
print d[0]
print d
關於deque的速度:from collections import deque
import time
d = deque(maxlen=1000000)
for i in xrange(1000000):
t1 = time.time()
d.rotate(500000)
t2 = time.time()
print t2 - t1
t3 = time.time()
print t3 - t2
結果是
0.000247955322266
2.40802764893e-05
因此,對於1000000個元素的佇列,增和刪的操作,在最差的情況下,在耗時在10−
4 量級
2,查和改
from collections import deque
import time
d = deque(maxlen=1000000)
for i in xrange(1000000):
t1 = time.time()
print d[500000]
t2 = time.time()
print t2 - t1
t3 = time.time()
d[500001] = '333'
t4 = time.time()
print t4 - t3
結果是:
0.00019097328186
0.00026798248291
對於1000000個元素的佇列,在最壞的情況下,查和改的耗時在10−
4 量級
3,取樣
from collections import deque
import time
import random
d = deque(maxlen=1000000)
for i in xrange(1000000):
t1 = time.time()
random.sample(d,64)
t2 = time.time()
print t2 - t1
結果是:0.0023889541626
random.sample()方法是未經優化的,用下面這個方法可以獲得更快的速度
def
sample
(d,k):
s_list = numpy.random.randint(0,len(d)*2/k,k).tolist()
#print s_list
result_list =
for i in s_list:
d.rotate(i)
return result_list
用這個方法耗時:0.00147318840027
以上時間的測量結果是有小幅波動的,並不十分精確
總結,1000000個元素,基本就是experience replay 的規模了。deque和list相比,優勢在於1執行緒安全2從兩段訪問資料是o(1)速度。而list從左邊訪問是o(n)速度,從右邊訪問是o(1)速度。
Python筆記 列表的一些小知識點(持續更新哦)
六月你好呀,最近太忙啦,都沒空程式設計!夏令營報的很麻煩,幾乎佔據了我大部分時間。不多bb,直接開始講吧!下面要講的是python中列表的複製 只有常規複製,才會指向同乙個列表。eg.lst 1,2,3,4,5 lst2 lst lst2.clear print lst 而copy函式 list 和...
PYTHON常用小知識(持續更新)
python判斷檔案和資料夾是否存在 import os os.path.isfile test.txt 如果不存在就返回false os.path.exists directory 如果目錄不存在就返回false python時間的處理 from time import 將time引入進來 fti...
Python易混淆知識(持續更新)
readline 方法用於從檔案讀取整行,包括 n 字元。如果指定了乙個非負數的引數,則返回指定大小的位元組數,包括 n 字元。filename example.txt with open filename,r encoding utf 8 as t while true line t.readli...