code_junkie

Getting the lesser n elements of a list in Python

Nov 12th, 2011
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. def mins(items, n):
  2. mins = [float('inf')]*n
  3. for item in items:
  4. for i, min in enumerate(mins):
  5. if item < min:
  6. mins.insert(i, item)
  7. mins.pop()
  8. break
  9. return mins
  10.  
  11. from random import randint, random
  12. import time
  13.  
  14. test_data = [randint(10, 50) + random() for i in range(20000)]
  15.  
  16. init = time.time()
  17. mins = mins(test_data, 8)
  18. print 'mins(items, n):', time.time() - init
  19.  
  20. init = time.time()
  21. mins = sorted(test_data)[:8]
  22. print 'sorted(items)[:n]:', time.time() - init
  23.  
  24. mins(items, n): 0.0632939338684
  25. sorted(items)[:n]: 0.0231449604034
  26.  
  27. mins = items[:n]
  28. mins.sort()
  29. for i in items[n:]:
  30. if i < mins[-1]:
  31. mins.append(i)
  32. mins.sort()
  33. mins= mins[:n]
  34.  
  35. mins(items, n): 0.297000169754
  36. sorted(items)[:n]: 0.109999895096
  37. mins2(items)[:n]: 0.0309998989105
  38.  
  39. import heapq
  40.  
  41. nlesser_items = heapq.nsmallest(n, items)
  42.  
  43. from bisect import insort
  44. from itertools import islice
  45.  
  46. def nsmallest_slott_bisect(n, iterable, insort=insort):
  47. it = iter(iterable)
  48. mins = sorted(islice(it, n))
  49. for el in it:
  50. if el <= mins[-1]: #NOTE: equal sign is to preserve duplicates
  51. insort(mins, el)
  52. mins.pop()
  53.  
  54. return mins
  55.  
  56. $ python -mtimeit -s "import marshal; from nsmallest import nsmallest$label as nsmallest; items = marshal.load(open('items.marshal','rb')); n = 10"
  57. "nsmallest(n, items)"
  58.  
  59. nsmallest_slott_bisect
  60.  
  61. import bisect
  62.  
  63. def mins(items, n):
  64. mins = [float('inf')]*n
  65. for item in items:
  66. bisect.insort(mins, item)
  67. mins.pop()
  68. return mins
  69.  
  70. mins(items, n): 0.0892250537872
  71. sorted(items)[:n]: 0.0990262031555
  72.  
  73. import bisect
  74. import psyco
  75. psyco.full()
  76.  
  77. def mins(items, n):
  78. mins = [float('inf')]*n
  79. for item in items:
  80. bisect.insort(mins, item)
  81. mins.pop()
  82. return mins
  83.  
  84. mins(items, n): 0.0431621074677
  85. sorted(items)[:n]: 0.0859830379486
Add Comment
Please, Sign In to add comment