fork 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. n = 6
  29. for k_exp in range(n+1):
  30. k = 10**k_exp
  31. print("k=", k)
  32. print("n=", 10**n)
  33. for method in (klargest_smallheap, klargest_fullheap,
  34. klargest_heapq):
  35. example = (randrange(1, 1000000000) for _ in range(10**n))
  36. t0 = clock()
  37. method(example, k)
  38. print("{:20s} {:6.3f}".format(method.__name__, clock() - t0))
Time limit exceeded #stdin #stdout 5s 12496KB
stdin
Standard input is empty
stdout
Standard output is empty