Numpy Exercise 2

Imports


In [24]:
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns

Factorial

Write a function that computes the factorial of small numbers using np.arange and np.cumprod.


In [25]:
def np_fact(n):
    """Compute n! = n*(n-1)*...*1 using Numpy."""
    if n==0:
        return 1
    else:
        a=np.arange(1.0, (n+1), 1.0)
        b= a.cumprod()
        c=max(b)
    return c


print(np_fact(10))


3628800.0

In [14]:
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 [43]:
def loop_fact(n):
    """Compute n! using a Python for loop."""
    a=[]
    c=1
    if n>0:
        b= list(range(1,n+1)) # so b is [ 1,2,3,4,...n]
        for x in b:      
            c=c*x
        return c
    else:
        return 1
        
print(loop_fact(5))


120

In [44]:
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 [55]:
%timeit -n1 -r1 np_fact(50)

%timeit -n1 -r1 loop_fact(50)


1 loops, best of 1: 94.9 µs per loop
1 loops, best of 1: 45.1 µs per loop

In the cell below, summarize your timing tests. Which version is faster? Why do you think that version is faster?

loop_fact is faster. Probably because my loop_fact only has one actual computation, c=c*x. Whereas np_fact has to arrange and aray and THEN cumprod().