1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
from decimal import *
def exp(x):
getcontext().prec += 2
i, lasts, s, fact, num = 0, 0, 1, 1, 1
while s != lasts:
lasts = s
i += 1
fact *= i
num *= x
s += num / fact
getcontext().prec -= 2
print(+s)
return +s
import time
start = time.time()
print("Original:")
d1_orig = exp(Decimal(150))
d2_orig = exp(Decimal(400))
d3_orig = exp(Decimal(3000))
elapsed_original = time.time() - start
print("Elapsed time, original (s): ", elapsed_original)
def exp_opt(x):
getcontext().prec += 2
i, lasts, s, fact, num = 0, 0, 1, 1, 1
nf = Decimal(1) ### = num / fact
while s != lasts:
lasts = s
i += 1
# was: fact *= i
# was: num *= x
nf *= (x / i) ### update nf to be num / fact
s += nf ### was: s += num / fact
getcontext().prec -= 2
print(+s)
return +s
start = time.time()
print("Optimized:")
d1_opt = exp_opt(Decimal(150))
d2_opt = exp_opt(Decimal(400))
d3_opt = exp_opt(Decimal(3000))
elapsed_optimized = time.time() - start
print("Elapsed time, optimized (s): ", elapsed_optimized)
print("Improvement: ", elapsed_original / elapsed_optimized)
assert d1_orig == d1_opt
assert d2_orig == d2_opt
assert d3_orig == d3_opt
print("All equivalent? ", d1_orig == d1_opt and d2_orig == d2_opt and d3_orig == d3_opt)
|