Python 在并行作业任务中使用优先级队列的最有效(1循环)方法

Python 在并行作业任务中使用优先级队列的最有效(1循环)方法,python,numpy,data-structures,implementation,priority-queue,Python,Numpy,Data Structures,Implementation,Priority Queue,我遇到了一个与数据结构相关的问题。我最近尝试了很多,但我不知道如何继续。问题是,我有正确的输出,但时间太慢,我没有通过自动测试 为了解决这个问题,我使用了一个最小堆来实现优先级队列,并为工作人员提供下一个空闲时间——如何使它更高效?效率在这里至关重要 任务描述 您有一个并行化的程序,它使用m个独立的线程来处理给定的n个作业列表。线程按照输入中给定的顺序接受作业。如果有空闲线程,它会立即从列表中获取下一个作业。如果线程已开始处理作业,则不会 中断或停止,直到完成作业处理。如果多个线程试图同时从列表

我遇到了一个与数据结构相关的问题。我最近尝试了很多,但我不知道如何继续。问题是,我有正确的输出,但时间太慢,我没有通过自动测试

为了解决这个问题,我使用了一个最小堆来实现优先级队列,并为工作人员提供下一个空闲时间——如何使它更高效?效率在这里至关重要

任务描述 您有一个并行化的程序,它使用m个独立的线程来处理给定的n个作业列表。线程按照输入中给定的顺序接受作业。如果有空闲线程,它会立即从列表中获取下一个作业。如果线程已开始处理作业,则不会 中断或停止,直到完成作业处理。如果多个线程试图同时从列表中获取作业,则索引较小的线程将获取作业。对于每个作业,您都确切地知道任何线程处理此作业需要多长时间,而这一时间对于所有线程都是相同的。你需要 确定每个作业的哪个线程将处理它以及它何时开始处理

输入格式。输入的第一行包含整数m工人数量和n工作数量。第二行包含n个整数——任何线程处理特定作业所需的时间(以秒为单位)。 时间的顺序与线程执行作业的列表中的顺序相同

输出格式。正好输出n行。使用的第i行基于0的索引应包含两个空格分隔的整数-将处理第i个作业的线程的基于0的索引和开始处理该作业的时间(以秒为单位)*


在快速阅读代码之后,我想到了一些事情

首先,除非有令人信服的理由编写自己的min-heap,否则您可能应该只使用现有的

在这种情况下,标准阵列可能比deque更快。所有的插入和移除操作都在阵列的末尾,因此您不必承担从中间或前面插入和移除的额外费用

您的降档代码有两个问题,一个次要问题和一个主要问题。您有以下循环:

while c <= self.size:
    c = self.min_child(i)
    if self.heap[i] > self.heap[c] or self.heap[i] == self.heap[c]:
        self.swap(i, c)
    i = c                   # new index after swapping with child
    c = c * 2               # new child index
执行循环的次数太多可能是您最大的性能问题,特别是在工作人员数量较多的情况下


最初有一种更快的方法来构建堆。排序列表是有效的最小堆。所以,您可以按顺序使用工作者编号初始化堆。当您可以在上初始化堆时,无需支付在日志n上插入单个工人的成本。如果您的工作进程没有按排序顺序排列,您仍然可以在上初始化堆。请参阅或查看。

中的heapifyx函数,您不使用的原因是?这不是队列问题-这是作业车间调度问题。使用来最小化完成时间。@我真的认为这是一个队列问题。规则非常明确,作业将按照给定的顺序由第一个可用线程进行处理。好的,是的,我收回这一点。家庭作业问题糟透了-发布的问题在现实世界中永远不会遇到。@玩家这个问题在现实世界中每天都会发生。这是一个单一生产者、多消费者系统的模拟。它甚至还有物理上的相似之处:比如Fry's Electronics的结账行,或者Wendy's有多个出纳员时的订单行。有没有一种数据结构可以让他根据处理时间对工作进行排序?@theMayer有很多这样的数据结构。当他必须按照输入的顺序处理作业时,这对他有什么帮助?非常感谢Jim!你说得对,相等条件是多余的,打破while循环绝对是个好主意。不过,我仍然大大超过了规定的时间。似乎我需要使用某种快速的内置实现……我的数据结构中有可比较的节点对象字典的原因是,我可以对它们进行排序,同时仍然知道它们的原始位置工作者索引是什么。我需要在交换索引时跟踪它们,你有什么建议?好的,heapify会对节点列表进行精细排序,但没有考虑先使用较小的辅助索引的索引要求。我试图找到排序的源代码-此排序工作正常,但找不到源代码。。
while c <= self.size:
    c = self.min_child(i)
    if self.heap[i] > self.heap[c] or self.heap[i] == self.heap[c]:
        self.swap(i, c)
    i = c                   # new index after swapping with child
    c = c * 2               # new child index
    if self.heap[i] < self.heap[c]
        break         # node is where it belongs. Exit loop
    # otherwise, swap and go around again
    self.swap(i, c)
    i = c
    c = c * 2