In [2]:
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
Write a function that computes the factorial of small numbers using np.arange and np.cumprod.
In [3]:
def np_fact(n):
"""Compute n! = n*(n-1)*...*1 using Numpy."""
if n == 0:
return 1
else:
vec = np.arange(1, n+1)
return np.cumprod(vec)[-1]
np_fact(4)
Out[3]:
In [3]:
assert np_fact(0)==1
assert np_fact(1)==1
assert np_fact(10)==3628800
assert [np_fact(i) for i in range(0,11)]==[1,1,2,6,24,120,720,5040,40320,362880,3628800]
Write a function that computes the factorial of small numbers using a Python loop.
In [4]:
def loop_fact(n):
"""Compute n! using a Python for loop."""
prod = 1
for i in range(1,n+1):
prod *= i
return prod
loop_fact(4)
Out[4]:
In [5]:
assert loop_fact(0)==1
assert loop_fact(1)==1
assert loop_fact(10)==3628800
assert [loop_fact(i) for i in range(0,11)]==[1,1,2,6,24,120,720,5040,40320,362880,3628800]
Use the %timeit magic to time both versions of this function for an argument of 50. The syntax for %timeit is:
%timeit -n1 -r1 function_to_time()
In [6]:
%timeit -n1 -r1 np_fact(50)
%timeit -n1 -r1 loop_fact(50)
In the cell below, summarize your timing tests. Which version is faster? Why do you think that version is faster?
I'm a bit confused. I was expecting np to be faster, but it appears the python loop (loop_fact) is faster. I may be misinterpreting the output. It appears np_fact is taking 47 microseconds per loop, while loop_fact is taking 15. Now, maybe I should multiply the 15 by 50, but not the 47?