fork(1) download
  1. from heapq import heappop, heapify, heapreplace, nlargest
  2. from itertools import islice
  3.  
  4.  
  5. def klargest_fullheap(iterable, k):
  6. heap = [-s for s in iterable]
  7. heapify(heap)
  8. return [-heappop(heap) for _ in range(k)]
  9.  
  10.  
  11. def klargest_smallheap(iterable, k):
  12. heap = list(islice(iterable, k))
  13. heapify(heap)
  14. for s in iterable:
  15. if s > heap[0]:
  16. heapreplace(heap, s)
  17. return [heappop(heap) for _ in range(k)]
  18.  
  19.  
  20. def klargest_heapq(iterable, k):
  21. return nlargest(k, iterable)
  22.  
  23.  
  24. if __name__ == "__main__":
  25. from random import randrange
  26. from time import clock
  27.  
  28. for k in (10, 20, 40, 80, 160, 320, 640, 1280):
  29. n = 5
  30. print("k=", k)
  31. print("n=", 10**n)
  32. for method in (klargest_smallheap, klargest_fullheap,
  33. klargest_heapq):
  34. example = (randrange(1, 1000000000) for _ in range(10**n))
  35. t0 = clock()
  36. method(example, k)
  37. print("{:20s} {:6.3f}".format(method.__name__, clock() - t0))
Success #stdin #stdout 2.26s 12496KB
stdin
Standard input is empty
stdout
k= 10
n= 100000
klargest_smallheap    0.092
klargest_fullheap     0.096
klargest_heapq        0.098
k= 20
n= 100000
klargest_smallheap    0.093
klargest_fullheap     0.092
klargest_heapq        0.096
k= 40
n= 100000
klargest_smallheap    0.092
klargest_fullheap     0.092
klargest_heapq        0.094
k= 80
n= 100000
klargest_smallheap    0.088
klargest_fullheap     0.093
klargest_heapq        0.097
k= 160
n= 100000
klargest_smallheap    0.088
klargest_fullheap     0.093
klargest_heapq        0.095
k= 320
n= 100000
klargest_smallheap    0.089
klargest_fullheap     0.091
klargest_heapq        0.096
k= 640
n= 100000
klargest_smallheap    0.090
klargest_fullheap     0.092
klargest_heapq        0.099
k= 1280
n= 100000
klargest_smallheap    0.091
klargest_fullheap     0.093
klargest_heapq        0.101