17

我正在运行多个线程并在队列中收集结果。我想将它转储到数组或列表中,以便我可以进行索引并检索这些结果。队列中的每个元素都是一个维度为 n 的数组。我想访问这些数组。请告诉我,我该怎么做?

 def dump_queue(model_queue):
 queue_list = []
 for i in iter(model_queue.get,'STOP'):
         queue_list.append(i)
  return queue_list




aux_model=train_svm(np.array(trainExample),np.array(trainLabel))
model_queue.put(aux_model.coef_)

因此,数组是 的学习模型参数svm。model_queue 在线程之间共享。我想访问每个模型参数向量,而不是模型参数的每个条目。

4

4 回答 4

49

您已经完成了并行部分,只想在列表中获得结果,是吗?然后尝试:

list(my_queue.queue)

例子:

from queue import Queue

q = Queue()
for i in range(5):
    q.put(i)

l = list(q.queue)
print(l)

输出:

[0, 1, 2, 3, 4]
于 2016-07-13T11:45:41.927 回答
5

不知道这是否是同一个问题,但我需要做同样的事情并最终写了这个。我在 python 2.7 中使用 threading.Thread 和 Queue 对象。只是想将队列转储到列表中。

def queue_to_list(q):
    """ Dump a Queue to a list """

    # A new list
    l = []

    while q.qsize() > 0:
        l.append(q.get())
    return l
于 2014-08-22T09:42:10.493 回答
1

就像加布里埃尔所说,你应该具体说明你的问题。

当您谈到数组时,我认为您指的是列表。Python 数组用于存储数值。

但是,您可以将队列转换为嵌套列表:# 输出列表:

collectedData = list()
# # # 
# for every thread, call:
threadBuffer = [item for item in q.queue]
collectedData.append(threadBuffer)

这将在嵌套列表中收集您的数据,您可以轻松访问这些列表,如下例所示:

l = list()
l.append([1,2,3,4,5,6,7,9,10])
l.append([6,7,8,9,0,11,22,33])

现在你可以自由访问了:l[1][2] -> 8

这对你有帮助吗?

最好的问候,克里斯蒂安

于 2013-07-18T08:43:05.900 回答
1

我会采用以下解决方案:

from collections import deque
q = deque()
for i in range(5):
    q.append([i,i+10])
listed_q = list(q)

现在您可以通过索引或切片轻松访问这些值:

print listed_q[1]        # [1, 11]
print listed_q[1][1]     # 11

由于 list() 创建了 q 的副本,因此您应该注意队列的维度。您的队列越长,执行此操作所需的时间就越长。可以使用 itertools.islice 找到另一种方法,在该方法中,您首先对队列进行切片,然后再将结果存储在列表中。查看以下链接(那里还提供了性能指标):

在 collections.deque 中使用切片表示法

如何切片双端队列?[复制]

于 2016-07-16T10:38:14.247 回答