【问题标题】:how to deepcopy a queue in python如何在python中深度复制队列
【发布时间】:2011-03-23 13:48:58
【问题描述】:

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

【问题讨论】:

  • 你为什么要这样做?请注意,队列并非旨在作为数据结构。

标签: python copy queue


【解决方案1】:

Python 中的queue module 用于同步线程之间的共享数据。它不是打算用作数据结构,并且不支持复制(甚至不支持浅拷贝)。

.get.put可以对一个Queue构造多个deepcopy,但是原来的Queue会被销毁。)

如果您想将队列(或堆栈)作为数据结构,use a collections.deque。如果您想要优先级队列,请使用heapq module。 deque 支持 deepcopy。 heapq 由列表支持,因此也支持 deepcopy。

【讨论】:

    【解决方案2】:

    不知道您的确切需求,但您可能会对我在 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()
    

    【讨论】:

      【解决方案3】:

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

      # 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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多