Как эффективно вытолкнуть все элементы с наименьшим ключом в heapq?

Я думаю, что я наблюдал аналогичную проблему: некоторые процессы начались, казалось, успешно выполнялись, но никогда не завершались. Функция waitFor () ожидала вечно, кроме случаев, когда я убил процесс в диспетчере задач. Однако все хорошо работало в случаях, когда длина командной строки была 127 символов или короче. Если длинные имена файлов неизбежны, вы можете захотеть использовать переменные среды, которые могут позволить вам сохранить строку командной строки коротким. Вы можете сгенерировать командный файл (используя FileWriter), в котором вы устанавливаете свои переменные окружения перед вызовом программы, которую вы действительно хотите запустить. Содержимое такой партии может выглядеть так:

    set INPUTFILE="C:\Directory 0\Subdirectory 1\AnyFileName"
    set OUTPUTFILE="C:\Directory 2\Subdirectory 3\AnotherFileName"
    set MYPROG="C:\Directory 4\Subdirectory 5\ExecutableFileName.exe"
    %MYPROG% %INPUTFILE% %OUTPUTFILE%

Последний шаг запускает этот командный файл с использованием Runtime.

1
задан Joe 17 January 2019 в 03:23
поделиться

2 ответа

Общая техника, которую вы показываете, является наиболее эффективной и простой. Но вы делаете дополнительные задания, которые на самом деле не нужны. Ниже приведена небольшая оптимизация.

elements = []
k1, v1 = heapq.heappop(heap)
elements.append((k1,v1))
while(k1 == heap[0]):
     k2, v2 = heapq.heappop(heap)
     elements.append((k2,v2))
return elements

Чтобы быть в безопасности, вы, вероятно, должны добавить проверки, чтобы убедиться, что ваша куча не пуста. Проверка heap[0], когда в куче нет элементов, будет плохой вещью, как и вызов heapq.heappop, если куча пуста.

0
ответ дан Jim Mischel 17 January 2019 в 03:23
поделиться

Я собирался предложить изменение структуры с кучи (k, v) на кучу k и словарь {k:[v]}. Это превратит ваш код в:

k = heap[0]
return [(k,v) for v in hash[k]]

С:

hash = defaultdict(list)
heap = []

heappush(heap, (k, v)) станет:

heappush(heap, k)
hash[k].append(v)

heappop(heap) станет: [1112 ]

k = heappop(heap)
v = hash[k].pop()
0
ответ дан Dan D. 17 January 2019 в 03:23
поделиться
Другие вопросы по тегам:

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