Numpy Exercise 2

Imports


In [13]:
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 [29]:
def np_fact(n):
    """Compute n! = n*(n-1)*...*1 using Numpy."""
    if n == 0:
        return 1
    else:
        fac = np.arange(n,0,-1)
        fa = fac.cumprod()
        return fa[n-1]

In [30]:
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 [32]:
def loop_fact(n):
    """Compute n! using a Python for loop."""
    a = 1
    if n==0:
        return 1
    else:
        while n > 0:
            a *= n
            n -= 1
        return a

In [33]:
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 [36]:
# YOUR CODE HERE
%timeit np_fact(50)
%timeit loop_fact(50)


The slowest run took 24.93 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 9.63 µs per loop
100000 loops, best of 3: 18.2 µs per loop

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

The numpy function was about twice as fast as the regular python loop function. This is because loops can be for anything but numpy is stored in memory in a way that makes it good for performing calculations.