Универсальная приоритетная очередь для Python

Вам нужен терминальный мультиплексор, например, tmux или экран GNU

Я удивлен, что небольшой комментарий Райана Амоса к оригиналу вопрос - это единственное упоминание о решении, которое гораздо предпочтительнее для всех остальных, независимо от того, насколько умны хитрость python и сколько им было получено. В дополнение к комментарию Райана, tmux является хорошей альтернативой экрану GNU.

Но принцип тот же: если вы когда-нибудь захотите оставить работу на терминале, когда вы выходите из системы, идите в кафе для сэндвича, поп в ванную, домой (и т. д.), а затем позже, снова подключитесь к терминальному сеансу из любого места или любого компьютера, как будто вы никогда не отсутствовали, терминальные мультиплексоры - это ответ . Подумайте о них как VNC или удаленный рабочий стол для сеансов терминала. Все остальное - обходной путь. В качестве бонуса, когда приходит босс и / или партнер, и вы случайно создаете ctrl-w / cmd-w в своем оконном окне вместо окна вашего браузера с его изворотливым контентом, вы не потеряете последние 18 часов обработки !

43
задан Eli Bendersky 3 January 2009 в 05:25
поделиться

4 ответа

Можно использовать Очередь. PriorityQueue.

Отзыв, что Python не со строгим контролем типов, таким образом, можно сохранить что-либо, которое Вам нравится: просто сделайте кортеж (priority, thing), и Вы установлены.

38
ответ дан Adrian W 23 September 2019 в 12:37
поделиться

Я закончил тем, что реализовал обертку для heapq, добавив dict для поддержания уникальных элементов очереди. Результат должен быть довольно эффективным для всех операторов:

class PriorityQueueSet(object):

    """
    Combined priority queue and set data structure.

    Acts like a priority queue, except that its items are guaranteed to be
    unique. Provides O(1) membership test, O(log N) insertion and O(log N)
    removal of the smallest item.

    Important: the items of this data structure must be both comparable and
    hashable (i.e. must implement __cmp__ and __hash__). This is true of
    Python's built-in objects, but you should implement those methods if you
    want to use the data structure for custom objects.
    """

    def __init__(self, items=[]):
        """
        Create a new PriorityQueueSet.

        Arguments:
            items (list): An initial item list - it can be unsorted and
                non-unique. The data structure will be created in O(N).
        """
        self.set = dict((item, True) for item in items)
        self.heap = self.set.keys()
        heapq.heapify(self.heap)

    def has_item(self, item):
        """Check if ``item`` exists in the queue."""
        return item in self.set

    def pop_smallest(self):
        """Remove and return the smallest item from the queue."""
        smallest = heapq.heappop(self.heap)
        del self.set[smallest]
        return smallest

    def add(self, item):
        """Add ``item`` to the queue if doesn't already exist."""
        if item not in self.set:
            self.set[item] = True
            heapq.heappush(self.heap, item)
17
ответ дан jsmedmar 23 September 2019 в 12:37
поделиться

Вы смотрели "Выставочная Исходная ссылка " на heapq странице? Существует пример, немного менее, чем промежуточный вниз использования "кучи" со списком (интервал, символ) кортежи как приоритетная очередь.

6
ответ дан Harper Shelby 23 September 2019 в 12:37
поделиться

Я не использовал его, но Вы могли попробовать PyHeap. Это записано в C так, надо надеяться, это достаточно быстро для Вас.

Вы, положительный heapq/PriorityQueue не будет достаточно быстр? Могло бы стоить собраться с одним из них запуститься, и затем представить, чтобы видеть, является ли это действительно Ваша производительность bottlneck.

7
ответ дан Kiv 23 September 2019 в 12:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: