I'm learning to use generators in Python 3 which also I just started learning. So I'm doing an experiment to see how much time do generators really save. Below is my code.
import time
def fib(n):
a = b = 1
result = []
for i in range(n):
result.append(a)
a, b = b, a + b
return result
def fib_gen(n):
a = b = 1
for i in range(n):
yield a
a, b = b, a + b
def calc(n):
start_time = time.perf_counter()
fib(n)
end_time = time.perf_counter() - start_time
print(f'fib({n})',end_time, 'secs')
start_time2 = time.perf_counter()
fib_gen(n)
end_time2 = time.perf_counter() - start_time2
print(f'fib_gen({n})',end_time2, 'secs')
print('Improvement %ge ',((end_time-end_time2)/end_time)*100)
for x in range(1, 10000, 1000):
calc(x)
Output:
fib(1) 4.976999999999759e-06 secs
fib_gen(1) 3.7599999999984868e-06 secs
Improvement %ge 24.452481414533484
fib(1001) 0.000278241999999998 secs
fib_gen(1001) 1.8640000000007262e-06 secs
Improvement %ge 99.33007957102065
fib(2001) 0.0006537540000000029 secs
fib_gen(2001) 1.4999999999980307e-06 secs
Improvement %ge 99.77055589717263
fib(3001) 0.0009883400000000007 secs
fib_gen(3001) 1.7100000000019877e-06 secs
Improvement %ge 99.82698261731773
fib(4001) 0.001559401999999998 secs
fib_gen(4001) 2.5110000000001798e-06 secs
Improvement %ge 99.8389767359539
fib(5001) 0.001501413 secs
fib_gen(5001) 1.582999999999446e-06 secs
Improvement %ge 99.89456598550835
fib(6001) 0.0019986470000000027 secs
fib_gen(6001) 1.186999999999716e-06 secs
Improvement %ge 99.94060982254497
fib(7001) 0.002645030999999999 secs
fib_gen(7001) 1.3070000000024729e-06 secs
Improvement %ge 99.95058659047842
fib(8001) 0.0035235960000000004 secs
fib_gen(8001) 3.18499999999583e-06 secs
Improvement %ge 99.90960938768248
fib(9001) 0.004458613 secs
fib_gen(9001) 5.944000000000782e-06 secs
Improvement %ge 99.866684998227
What I don't want to believe is that every time the generators are almost 99% better. How so? What do I need to do grasp it better.