Wednesday, August 24, 2022

Python collections.deque

 Модуль коллекций Python предоставляет класс под названием deque, специально разработанный для обеспечения быстрых и эффективных способов добавления и извлечения элементов с обоих концов базовой структуры данных. Двухсторонняя очередь Python (collections.deque) - это низкоуровневая и высокооптимизированная двусторонняя очередь, которая полезна для реализации элегантных, эффективных очередей и стеков Pythonic, которые являются наиболее распространенными типами данных, подобными спискам, в вычислениях.

(.env) boris@boris-All-Series:~/FIFOTORCH$ cat fifoPyTorch1.py

import time

import torch

from collections import deque

length = 5000

queue = deque([0]*200)

ten = torch.tensor(queue)

s = time.time()

for i in range(length):

    for j in range(200):  

        queue.pop()      

        queue.appendleft(j*10)        

    torch.tensor(queue)

    # after some appending/popping elements, cast to tensor

print("finish deque:", time.time()-s)

s = time.time()

for i in range(length):

    for j in range(200):

        newelem = torch.tensor([j*10])

        ten = torch.cat((ten[1:], newelem))

        #using tensor as FIFO, no need to cast to tensor

print("finish tensor:", time.time()-s)


(.env) boris@boris-All-Series:~/FIFOTORCH$ python3 fifoPyTorch1.py

finish deque: 0.1758899688720703

finish tensor: 11.722903728485107















При length = 10 тестируем код

(.env) boris@boris-All-Series:~/FIFOTORCH$ cat fifoPyTorch2.py 

import time

import torch

from collections import deque

length = 10

queue = deque([0]*200)

ten = torch.tensor(queue)

s = time.time()

for i in range(length):

    for j in range(200):  

        queue.pop()      

        queue.appendleft(j*10)       

    torch.tensor(queue)

print(torch.tensor(queue))

# after some appending/popping elements, cast to tensor

print("finish deque:", time.time()-s)


s = time.time()

for i in range(length):

    for j in range(200):

        newelem = torch.tensor([j*10])

        ten = torch.cat((ten[1:], newelem))

        #using tensor as FIFO, no need to cast to tensor

print(ten)

print("finish tensor:", time.time()-s)

(.env) boris@boris-All-Series:~/FIFOTORCH$ python3 fifoPyTorch2.py 

tensor([1990, 1980, 1970, 1960, 1950, 1940, 1930, 1920, 1910, 1900, 1890, 1880,

        1870, 1860, 1850, 1840, 1830, 1820, 1810, 1800, 1790, 1780, 1770, 1760,

        1750, 1740, 1730, 1720, 1710, 1700, 1690, 1680, 1670, 1660, 1650, 1640,

        1630, 1620, 1610, 1600, 1590, 1580, 1570, 1560, 1550, 1540, 1530, 1520,

        1510, 1500, 1490, 1480, 1470, 1460, 1450, 1440, 1430, 1420, 1410, 1400,

        1390, 1380, 1370, 1360, 1350, 1340, 1330, 1320, 1310, 1300, 1290, 1280,

        1270, 1260, 1250, 1240, 1230, 1220, 1210, 1200, 1190, 1180, 1170, 1160,

        1150, 1140, 1130, 1120, 1110, 1100, 1090, 1080, 1070, 1060, 1050, 1040,

        1030, 1020, 1010, 1000,  990,  980,  970,  960,  950,  940,  930,  920,

         910,  900,  890,  880,  870,  860,  850,  840,  830,  820,  810,  800,

         790,  780,  770,  760,  750,  740,  730,  720,  710,  700,  690,  680,

         670,  660,  650,  640,  630,  620,  610,  600,  590,  580,  570,  560,

         550,  540,  530,  520,  510,  500,  490,  480,  470,  460,  450,  440,

         430,  420,  410,  400,  390,  380,  370,  360,  350,  340,  330,  320,

         310,  300,  290,  280,  270,  260,  250,  240,  230,  220,  210,  200,

         190,  180,  170,  160,  150,  140,  130,  120,  110,  100,   90,   80,

          70,   60,   50,   40,   30,   20,   10,    0])

finish deque: 0.0010824203491210938

tensor([   0,   10,   20,   30,   40,   50,   60,   70,   80,   90,  100,  110,

         120,  130,  140,  150,  160,  170,  180,  190,  200,  210,  220,  230,

         240,  250,  260,  270,  280,  290,  300,  310,  320,  330,  340,  350,

         360,  370,  380,  390,  400,  410,  420,  430,  440,  450,  460,  470,

         480,  490,  500,  510,  520,  530,  540,  550,  560,  570,  580,  590,

         600,  610,  620,  630,  640,  650,  660,  670,  680,  690,  700,  710,

         720,  730,  740,  750,  760,  770,  780,  790,  800,  810,  820,  830,

         840,  850,  860,  870,  880,  890,  900,  910,  920,  930,  940,  950,

         960,  970,  980,  990, 1000, 1010, 1020, 1030, 1040, 1050, 1060, 1070,

        1080, 1090, 1100, 1110, 1120, 1130, 1140, 1150, 1160, 1170, 1180, 1190,

        1200, 1210, 1220, 1230, 1240, 1250, 1260, 1270, 1280, 1290, 1300, 1310,

        1320, 1330, 1340, 1350, 1360, 1370, 1380, 1390, 1400, 1410, 1420, 1430,

        1440, 1450, 1460, 1470, 1480, 1490, 1500, 1510, 1520, 1530, 1540, 1550,

        1560, 1570, 1580, 1590, 1600, 1610, 1620, 1630, 1640, 1650, 1660, 1670,

        1680, 1690, 1700, 1710, 1720, 1730, 1740, 1750, 1760, 1770, 1780, 1790,

        1800, 1810, 1820, 1830, 1840, 1850, 1860, 1870, 1880, 1890, 1900, 1910,

        1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990])

finish tensor: 0.024991273880004883

















No comments:

Post a Comment