Numpy Exercise 2

Imports


In [7]:
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 [17]:
def np_fact(n):
#     if n == 0:
#         return 1
#     elif n == 1:
#         return 1
#     elif n == 10:
#         return 3628800

    if n==0: 
        return 1
    return np.cumprod(np.arange(1.0,n+1.0,1.0))[-1.0]
print np_fact(10)


3628800.0

In [18]:
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 [19]:
def loop_fact(n):
    q = 1
    for i in range(n):
        q = q * (i+1)
    return q

print np_fact(5)


120.0

In [20]:
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 [21]:
# YOUR CODE HERE
# raise NotImplementedError()
%timeit -n1 -r1 np_fact(50)
%timeit -n1 -r1 loop_fact(50)


1 loops, best of 1: 175 µs per loop
1 loops, best of 1: 31 µs per loop

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

The loop was faster then using np.cumprod