In [ ]:
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 [67]:
def np_fact(n):
"""Compute n! = n*(n-1)*...*1 using Numpy."""
if n==0:
c=1 # this makes it so if 0 is imputed a 1 is reurned
return c
else:
a=np.arange(1,n+1,1) #aranges a function up to n in 1 increments
b=np.cumprod(a) #multiplies each term as it goes up
c=b[::-1] #reverses the array of numbers
d=c[0:1] #takes the largest of them, the first term
return d
print np_fact(10) #ensuring correctness
In [68]:
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 [60]:
def loop_fact(n):
K=1 #defines the variable
for x in range(1,n+1):#for loop in the range 1-n
K*=x #makes the factorial
return K
print loop_fact(1) #ensures it was working
In [61]:
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 [66]:
%timeit -n1 -r1 np_fact(50) #times the first function
%timeit -n1 -r1 loop_fact(50) #times the second function
In the cell below, summarize your timing tests. Which version is faster? Why do you think that version is faster?
The loop function is faster. This is because it is shorter and more concise leading to less to do.