Используйте heapq.heapreplace
.Самый маленький элемент всегда находится на q[0]
, поэтому измените его, если необходимо, и затем вызовите:
heapq.heapreplace(q, q[0])
Я проверил ваше время и переписал его на скорость:
import time
import heapq
s = time.time()
q = list(range(0, 10000))
heapq.heapify(q)
for i in range(0, 10000):
heapq.heapreplace(q, 10000+i)
print(q[0])
e2 = time.time()
print(e2 - s)
s = time.time()
q = list(range(0, 10000))
heapq.heapify(q)
for i in range(0, 10000):
q[0] = 10000+i
heapq._siftup(q, 0)
print(q[0])
e2 = time.time()
print(e2 - s)
Производит:
10000
0.006845951080322266
10000
0.06091189384460449
Быстрее создать список и затем вызвать heapify
, затем использовать heappush
.
heapq.heapreplace
быстрее, чем heapq._siftup
, так как heapreplace
используетМодуль C для heapq
, где _siftup
в Python._siftup
и _siftdown
появляются только в heapq.py
, а не в _heapq
модуле
Не звоните ни _siftup
, ни _siftdown
.Они являются внутренними для реализации Python heapq
.
Я тестировал это с Python 3.2.3