#!/usr/bin/env python # coding: utf-8 # ## List Comprehension # In[1]: lst = [] for i in range(10): lst += [i] # In[2]: lst # In[3]: lst = [] for i in range(10): lst.append(i) # In[4]: lst # In[7]: lst = [i for i in range(10)] # In[8]: lst # In[3]: lst = [] for i in range(10): lst += [2] lst.append(2) lst # In[10]: lst = [2 for i in range(10)] lst # In[4]: lst = [2*x for x in range(0,10,2)] lst # In[5]: lst2 = [l+1 for l in lst] lst2 # ## Time Complexity # In[ ]: import time # We noticed yesterday that some functions \n # take longer than others -- even our computer \n # isn't fast enough to do every function "instantly" # In[6]: def fib(n): fib_i_prev_prev = 0 # initialized to F(0) fib_i_prev = 1 # initialized to F(1) for i in range(n - 1): # compute the next number in the sequence fib_i = fib_i_prev_prev + fib_i_prev # save state to use for the next computation fib_i_prev_prev = fib_i_prev fib_i_prev = fib_i return fib_i # In[7]: def fib_rec(n): if n == 0 or n == 1: return n else: return fib(n-1) + fib(n-2) # In[8]: start = time.time() fib(40) end = time.time() print(end-start) # In[9]: start = time.time() fib_rec(40) end = time.time() print(end-start) # We can experiment with how long a function takes with a simple example # In[60]: for i in range(100000000): result = i print(result) # In[12]: start = time.time() n = 10**7 for i in range(n): result = i end = time.time() time_1 = end-start print('n: ', n, 'time: ', time_1, 'seconds') # In[62]: start = time.time() n = 2*10**7 for i in range(n): result = i end = time.time() time_2 = end-start print('n: ', n, 'time: ', time_2, 'seconds') # In[63]: start = time.time() n = 3*(10**7) for i in range(n): result = i end = time.time() time_3 = end-start print('n: ', n, 'time: ', time_3, 'seconds') # In[64]: start = time.time() n = 4*(10**7) for i in range(n): result = i end = time.time() time_4 = end-start print('n: ', n, 'time: ', time_4, 'seconds') # In[65]: start = time.time() n = 5*(10**7) for i in range(n): result = i end = time.time() time_5 = end-start print('n: ', n, 'time: ', time_5, 'seconds') # In[66]: from matplotlib import pyplot as plt # In[67]: plt.scatter([1*(10**7),2*(10**7),3*(10**7),4*(10**7),5*(10**7)], [time_1,time_2,time_3,time_4,time_5]) plt.title('Time vs n') plt.xlabel('n') plt.ylabel('Time (s)') plt.show() # In[70]: start = time.time() n = 10000 for i in range(n): for j in range(n): result = j print(result) end = time.time() print(end-start,'seconds') # In[71]: start = time.time() for i in range(1000): for j in range(1000): result = j end = time.time() time_1 = end-start print('n: ', 1000, 'time: ', time_1, 'seconds') # In[72]: start = time.time() for i in range(2000): for j in range(2000): result = j end = time.time() time_2 = end-start print('n: ', 2000, 'time: ', time_2, 'seconds') # In[73]: start = time.time() for i in range(3000): for j in range(3000): result = j end = time.time() time_3 = end-start print('n: ', 3000, 'time: ', time_3, 'seconds') # In[74]: start = time.time() for i in range(4000): for j in range(4000): result = j end = time.time() time_4 = end-start print('n: ', 4000, 'time: ', time_4, 'seconds') # In[75]: start = time.time() for i in range(5000): for j in range(5000): result = j end = time.time() time_5 = end-start print('n: ', 5000, 'time: ', time_5, 'seconds') # In[76]: start = time.time() for i in range(6000): for j in range(6000): result = j end = time.time() time_6 = end-start print('n: ', 6000, 'time: ', time_6, 'seconds') # In[77]: start = time.time() for i in range(7000): for j in range(7000): result = j end = time.time() time_7 = end-start print('n: ', 7000, 'time: ', time_7, 'seconds') # In[78]: start = time.time() for i in range(8000): for j in range(8000): result = j end = time.time() time_8 = end-start print('n: ', 7000, 'time: ', time_8, 'seconds') # In[79]: plt.scatter([1000,2000,3000,4000,5000,6000,7000,8000], [time_1,time_2,time_3,time_4,time_5,time_6,time_7,time_8]) plt.title('Time vs Iterations') plt.xlabel('Iterations') plt.ylabel('Time (s)') plt.show() # ## Search # In[84]: tas = ['hailey','wassim','shalom','monica','bre','aku','kidist','bruk'] # Where in the list is `aku`? (at which index -- remember indices start from 0) # In[ ]: # Where in the list is `wassim`? (at which index -- remember indices start from 0) # In[ ]: # Write a function to find the index of a TA in the list # In[ ]: def find_index_of_name(lst,name): return 0 # In[ ]: # What if the list is sorted? # In[82]: tas_sorted = ['sxrtu6etraku','bre','bruk','hailey','kidist','monica','shalom','wassim'] # Write a function to find `aku` in the sorted list # In[ ]: # Write a function to find `wassim` in the sorted list # In[ ]: # ### Phone Book Demo # ## Sort List # How can we sort a list? # ### Insertion # #### Insertion Sort Demo # Can anyone explain what's happening? # Real life insertion sort # In[ ]: