Вам нужен терминальный мультиплексор, например, tmux или экран GNU
Я удивлен, что небольшой комментарий Райана Амоса к оригиналу вопрос - это единственное упоминание о решении, которое гораздо предпочтительнее для всех остальных, независимо от того, насколько умны хитрость python и сколько им было получено. В дополнение к комментарию Райана, tmux является хорошей альтернативой экрану GNU.
Но принцип тот же: если вы когда-нибудь захотите оставить работу на терминале, когда вы выходите из системы, идите в кафе для сэндвича, поп в ванную, домой (и т. д.), а затем позже, снова подключитесь к терминальному сеансу из любого места или любого компьютера, как будто вы никогда не отсутствовали, терминальные мультиплексоры - это ответ . Подумайте о них как VNC или удаленный рабочий стол для сеансов терминала. Все остальное - обходной путь. В качестве бонуса, когда приходит босс и / или партнер, и вы случайно создаете ctrl-w / cmd-w в своем оконном окне вместо окна вашего браузера с его изворотливым контентом, вы не потеряете последние 18 часов обработки !
Можно использовать Очередь. PriorityQueue.
Отзыв, что Python не со строгим контролем типов, таким образом, можно сохранить что-либо, которое Вам нравится: просто сделайте кортеж (priority, thing)
, и Вы установлены.
Я закончил тем, что реализовал обертку для 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)
Вы смотрели "Выставочная Исходная ссылка " на heapq странице? Существует пример, немного менее, чем промежуточный вниз использования "кучи" со списком (интервал, символ) кортежи как приоритетная очередь.
Я не использовал его, но Вы могли попробовать PyHeap. Это записано в C так, надо надеяться, это достаточно быстро для Вас.
Вы, положительный heapq/PriorityQueue не будет достаточно быстр? Могло бы стоить собраться с одним из них запуститься, и затем представить, чтобы видеть, является ли это действительно Ваша производительность bottlneck.