Advertisement
Pietu1998

Golfed square root v2

Dec 6th, 2014
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.89 KB | None | 0 0
  1. # More efficient, 58 bytes (+ function name)
  2.  
  3. def square_root(x,i):
  4.  v=x
  5.  while(v*v-x)*i:v=v/2+x/v/2;i-=1
  6.  return v
  7.  
  8. # Inefficient, 51 bytes (+ function name)
  9.  
  10. def square_root_b(x,i):
  11.  v=x
  12.  while i:v=v/2+x/v/2;i-=1
  13.  return v
  14.  
  15. # Lambda oneliner, 87 bytes (+ function name)
  16.  
  17. square_root_c=lambda x,i:(lambda f,*a:f(f,*a))(lambda f,v,x,i:f(f,v/2+x/v/2,x,i-1)if i else v,x,x,i)
  18.  
  19. # Benchmark
  20.  
  21. import time, math, sys
  22. sys.setrecursionlimit(100000)
  23. size = 10000
  24. r = range(1, size + 1)
  25. a = [0] * (size + 1)
  26. b = [0] * (size + 1)
  27. c = [0] * (size + 1)
  28. # Processor warmup
  29. print("Warming up...", end = "")
  30. for i in range(1, 10001):
  31.     square_root(i, 1000)
  32.     square_root_b(i, 1000)
  33.     square_root_c(i, 1000)
  34.     if i % 100 == 1:
  35.         print("\rWarming up... %s%%" % (i // 100 + 1), end="")
  36. print("\rWarming up... Done")
  37. # Efficient method
  38. print("Benchmarking efficient method... ", end = "")
  39. time_a = time.perf_counter()
  40. for i in r:
  41.     a[i] = square_root(i, 1000)
  42. time_b = time.perf_counter()
  43. print("Done")
  44. # Inefficient method
  45. print("Benchmarking inefficient method... ", end = "")
  46. time_c = time.perf_counter()
  47. for i in r:
  48.     b[i] = square_root_b(i, 1000)
  49. time_d = time.perf_counter()
  50. print("Done")
  51. # Inefficient method
  52. print("Benchmarking lambda oneliner... ", end = "")
  53. time_e = time.perf_counter()
  54. for i in r:
  55.     c[i] = square_root_c(i, 1000)
  56. time_f = time.perf_counter()
  57. print("Done")
  58. # Result
  59. err_a = err_b = err_c = 0
  60. for i in r:
  61.     err_a += abs(a[i] - math.sqrt(i))
  62.     err_b += abs(b[i] - math.sqrt(i))
  63.     err_c += abs(c[i] - math.sqrt(i))
  64. print("Efficient method:   %d roots in %.3fms, total error %.8f" % (size, (time_b - time_a) * 1000, err_a))
  65. print("Inefficient method: %d roots in %.3fms, total error %.8f" % (size, (time_d - time_c) * 1000, err_b))
  66. print("Lambda oneliner:    %d roots in %.3fms, total error %.8f" % (size, (time_f - time_e) * 1000, err_c))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement