Advertisement
Guest User

Untitled

a guest
May 24th, 2015
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. from timeit import repeat
  2. from math import log
  3. from time import time
  4.  
  5. def estimate_big_o(fun):
  6. timings = []
  7. data_length = 2**5
  8. while data_length <= 2**14:
  9. seconds = repeat(
  10. stmt='%s(%d)' % (fun.__name__, data_length),
  11. setup='from __main__ import %s' % fun.__name__,
  12. number=1,
  13. repeat=4)
  14. timings.append(min(seconds))
  15. data_length *= 2
  16. if sum(seconds) > 10:
  17. break
  18. print(list(zip([2**x for x in range(5,15)],timings)))
  19. fits = compare_fit(timings)
  20. return min(fits, key=fits.get)
  21.  
  22. def compare_fit(timings):
  23. top = 2**(len(timings)+4)
  24. fits = {}
  25. reference_functions = {
  26. 'O(1)': lambda n: timings[-1],
  27. 'O(log n)': lambda n: log(n)*(timings[-1]/log(top)),
  28. 'O(n)': lambda n: n*(timings[-1]/top),
  29. 'O(n log n)': lambda n: n*log(n)*(timings[-1]/(top*log(top))),
  30. 'O(n^2)': lambda n: (n**2)*(timings[-1]/top**2)}
  31. for curve, fun in reference_functions.items():
  32. reference_timing = [fun(n) for n in (2**x for x in range(5, len(timings)+5))]
  33. fits[curve] = sum((abs(a-b) for a, b in zip(timings, reference_timing)))
  34. return fits
  35.  
  36. def test1(n):
  37. return len(range(int(log(time()**-3))))
  38.  
  39. def test2(n):
  40. return min(range(n))
  41.  
  42. def test3(n):
  43. return sum(a+b for a in range(n) for b in range(n))
  44.  
  45. for test in (test1, test2, test3):
  46. print(test.__name__, estimate_big_o(test))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement