繁体   English   中英

如何在python中深度复制队列

[英]how to deepcopy a queue in python

嗨,如何在 python 中深度复制队列? 谢谢

Python 中的queue模块用于同步线程之间的共享数据。 不是一种数据结构,也不支持复制(甚至不支持浅复制)。

(可以通过.get.put构造一个 Queue 的许多 deepcopy,但原始 Queue 将被销毁。)

如果您想将队列(或堆栈)作为数据结构,请使用collections.deque 如果需要优先队列,请使用heapq模块 双端队列支持深拷贝。 heapq 由列表支持,因此也支持 deepcopy。

不知道您的确切需求,但您可能会对我在 DaniWeb 讨论中发布的有关优先级队列的代码感兴趣。 该列表很容易通过切片等方式保存副本。

#Python 2.6.5
from random import randint
class Priority:
   def __init__(self,prioritylevels=5):
      """The constructor builds list for priority queue which would be used later
      """
      self.prioritylevels = prioritylevels
      self.pq = [[] for priority in range(self.prioritylevels)] # prioritylevels

   def add_to_queue(self, data, priority=None):
       """Add every received in data and use priority parameter or
         its priority key to get its priority value (1 == highest) in the global queue
       """
       if priority is None: priority = data['priority']-1
       else: priority -= 1

       if 0 <= priority < self.prioritylevels:
             self.pq[priority].append(data)
       else: raise ValueError,"Priority level out of bounds: %s" % priority

   def get(self):
       """ get lowest priority values first from queue """
       for priorityevents in self.pq:
            while priorityevents:
                yield priorityevents.pop(0) ## use list as queue to keep insertion order (remove from front)               
   def num_items(self):
      return sum(len(q) for q in self.pq)


if __name__ == '__main__':

   myqueue = Priority(8)
   for i in range(100000):
      item=randint(0,234234)
      if not i % 10000: print i,
      priority=(item & 0b111) +1 ## lets three lowest bits decide which priority we give
      myqueue.add_to_queue(('Number',item),priority=priority)

   print "\n%i items in queues" % myqueue.num_items()
   print "Items by priorities"
   print '\n'.join("%i: %i" % (priority+1,len(q)) for priority, q in enumerate(myqueue.pq))
   print "\nGetting items out of queue in priority order:"
   priority=0
   for description,i in myqueue.get():
       assert (i & 0b111 >= priority), '** Bug ***' ## validity test priority must be same or lower for items
       priority = i & 0b111 
   # empty after get
   print "Finished"
   print "%i items in queue" % myqueue.num_items()

您可以使用简单的代码片段将一个队列的成员复制到另一个队列,如下所示

# delcare queues 
q1 = queue.Queue()
q2 = queue.Queue()

# perform a deep copy ( copy all elemts from q2 to q1 ) 
while not q2.empty():
         q1.put(q2.get())
         q2.task_done()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM