Searching, Sorting, and Timing

Agenda

  1. Timing
  2. Prelude: Timing list indexing
  3. Linear search
  4. Binary search
  5. Insertion sort

1. Timing

In [190]:
import time
time.time()

# Return the time in seconds since the epoch as a floating point number.
# On Windows and most Unix systems, the epoch is January 1, 1970, 00:00:00 (UTC)

# read https://docs.python.org/3/library/time.html#time.time
Out[190]:
1536780896.257849
In [191]:
start = time.time()

end = time.time()

end - start
Out[191]:
2.9087066650390625e-05
In [194]:
start = time.time()

sum(range(10_000_000))

end = time.time()
end - start
Out[194]:
0.26558709144592285
In [207]:
# why the measurement is different each time?

total = 0

for _ in range(10):      #take an average of 10 runs
    start = time.time()
    sum(range(10_000_000))
    end = time.time()
    total += end - start

total/10
Out[207]:
0.20874271392822266
In [195]:
# make it as a more general purpose timing function 

def timeit(f, n):
    total = 0

    for _ in range(n):
        start = time.time()
        f()
        end = time.time()
        total += end - start

    return total/n
In [197]:
timeit(lambda: sum(range(10_000_000)), 10)
Out[197]:
0.19438555240631103
In [198]:
# make it as an even more general purpose timing function 

def timeit(fn_to_test, setup_fn, n):
    total = 0
    setup_fn() # option 1 to place setup_fn()
    for _ in range(n):
        setup_fn() # option 2 to place setup_fn(); setup_fn is not timed
        start = time.time()
        fn_to_test() # timing measurement for this func
        end = time.time()
        total += end - start

    return total/n
In [199]:
lst = []

#setup function
def populate_list(): 
    lst.clear()
    for i in range(100):
        lst.append(i)

#test function
def test_contains():
    for i in range(100):
        if i in lst:
            pass
In [200]:
timeit(test_contains, populate_list, 100)
Out[200]:
8.055448532104492e-05
In [208]:
# self-reading, existing timeit lib

# https://docs.python.org/3.6/library/timeit.html

import timeit

timeit.timeit(stmt='sum(range(10_000_000))', number=10)/10
Out[208]:
0.20798762569902465
In [201]:
# magic cell function (with notebook)
# timing a notebook cell 

%timeit sum(range(10_000_000))
191 ms ± 11.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [ ]:
# self-reading, %time's ref document
?%time 

2. Prelude: Timing list indexing

In [202]:
import timeit

timeit.timeit(stmt='lst[0]',
              setup='import random; lst=[0] * 10**6')


# note that setup only run once
# return the first element of the 1-million-element list 
Out[202]:
0.04877838000538759
In [203]:
timeit.timeit(stmt='lst[10**6-1]',
              setup='import random; lst=[0] * 10**6')

# return the last element of the 1-million-element list 
Out[203]:
0.04921417200239375
In [ ]:
# why the above two statements return similar timing measurement results?

# hint: a python list is essentially implemented like an array 
# elements are continuously placed in the memory
In [204]:
import random
size = 10**3
times = [0] * size
lst   = [0] * size

for _ in range(100):
    for i in range(size):
        times[i] += timeit.timeit(stmt='lst[{}]'.format(i), lst[i]
                                  globals=globals(),
                                  number=10)
In [205]:
times
Out[205]:
[9.361098636873066e-05,
 8.29220371088013e-05,
 7.980699592735618e-05,
 8.19520209915936e-05,
 8.010891906451434e-05,
 7.770306547172368e-05,
 7.849202665966004e-05,
 8.887301373761147e-05,
 8.01810238044709e-05,
 7.81389680923894e-05,
 7.694486703258008e-05,
 7.850502151995897e-05,
 7.755505794193596e-05,
 7.453501166310161e-05,
 7.686796016059816e-05,
 7.773199467919767e-05,
 0.00011153004015795887,
 7.654608634766191e-05,
 7.703302253503352e-05,
 7.636901864316314e-05,
 7.823199848644435e-05,
 7.425206422340125e-05,
 7.494507008232176e-05,
 7.4788011261262e-05,
 8.007294673006982e-05,
 7.495300087612122e-05,
 7.684092270210385e-05,
 7.551601447630674e-05,
 7.71189370425418e-05,
 7.310205546673387e-05,
 7.304598693735898e-05,
 7.857708260416985e-05,
 7.790199015289545e-05,
 7.472505967598408e-05,
 7.599806122016162e-05,
 7.787700451444834e-05,
 8.190207881852984e-05,
 7.865793304517865e-05,
 7.725702016614377e-05,
 7.687004108447582e-05,
 8.065502333920449e-05,
 7.599698437843472e-05,
 7.658092363271862e-05,
 0.00010330298391636461,
 7.883399666752666e-05,
 7.599404489155859e-05,
 7.605296559631824e-05,
 7.698095578234643e-05,
 7.94579682406038e-05,
 7.75579537730664e-05,
 7.729495700914413e-05,
 7.641692354809493e-05,
 7.669503975193948e-05,
 7.565098349004984e-05,
 7.543199171777815e-05,
 7.465814996976405e-05,
 7.838413876015693e-05,
 7.453899888787419e-05,
 7.473802543245256e-05,
 7.454605656675994e-05,
 7.491698488593102e-05,
 7.39649694878608e-05,
 7.522197847720236e-05,
 7.624700083397329e-05,
 7.783406181260943e-05,
 7.76820961618796e-05,
 7.766913040541112e-05,
 0.00011594404350034893,
 7.631108746863902e-05,
 7.662798452656716e-05,
 7.87320313975215e-05,
 7.992192695382982e-05,
 8.12559446785599e-05,
 7.688289042562246e-05,
 7.455602462869138e-05,
 7.764581823721528e-05,
 7.739407010376453e-05,
 7.876001473050565e-05,
 7.510198338422924e-05,
 7.532098970841616e-05,
 7.899395131971687e-05,
 7.679002010263503e-05,
 0.00014623685274273157,
 7.880189514253289e-05,
 7.500703213736415e-05,
 7.564002589788288e-05,
 7.678398105781525e-05,
 7.643498247489333e-05,
 8.024895214475691e-05,
 7.846193329896778e-05,
 7.945696415845305e-05,
 7.786604692228138e-05,
 7.784306944813579e-05,
 7.656897651031613e-05,
 7.580211968161166e-05,
 0.0001163909473689273,
 8.24671151349321e-05,
 7.93990766396746e-05,
 7.596692012157291e-05,
 7.701103459112346e-05,
 7.63080024626106e-05,
 7.661900599487126e-05,
 7.694288797210902e-05,
 7.76600354583934e-05,
 8.071998308878392e-05,
 7.631003973074257e-05,
 7.865896623115987e-05,
 7.922700024209917e-05,
 7.765501504763961e-05,
 7.614298374392092e-05,
 7.686298340559006e-05,
 7.969995203893632e-05,
 7.85558222560212e-05,
 0.00011398299830034375,
 7.59490649215877e-05,
 7.741904119029641e-05,
 7.666106102988124e-05,
 7.688996265642345e-05,
 7.598401862196624e-05,
 7.818502490408719e-05,
 7.951493898872286e-05,
 7.579800148960203e-05,
 7.403998461086303e-05,
 7.381502655334771e-05,
 7.61070114094764e-05,
 7.539201760664582e-05,
 8.897906809579581e-05,
 7.818201265763491e-05,
 7.964106043800712e-05,
 8.648696530144662e-05,
 7.717507833149284e-05,
 7.755497063044459e-05,
 7.71750055719167e-05,
 7.691202335990965e-05,
 8.018915832508355e-05,
 9.351295011583716e-05,
 7.85189913585782e-05,
 7.654503860976547e-05,
 7.5706877396442e-05,
 7.529501453973353e-05,
 8.505300502292812e-05,
 7.389698293991387e-05,
 7.62550625950098e-05,
 0.00010861286136787385,
 7.937595364637673e-05,
 7.707804616075009e-05,
 7.673892832826823e-05,
 7.565294799860567e-05,
 7.641098636668175e-05,
 7.708597695454955e-05,
 7.506294059567153e-05,
 7.742102025076747e-05,
 8.059684478212148e-05,
 7.515591278206557e-05,
 0.00010654090146999806,
 7.522309897467494e-05,
 7.480799104087055e-05,
 7.344201731029898e-05,
 7.290199573617429e-05,
 7.357096183113754e-05,
 7.655897934455425e-05,
 7.334200199693441e-05,
 7.284895400516689e-05,
 7.266798638738692e-05,
 7.178002852015197e-05,
 7.30149622540921e-05,
 7.334901602007449e-05,
 7.404688221868128e-05,
 7.67019810155034e-05,
 7.358395669143647e-05,
 7.42529082344845e-05,
 8.499689283780754e-05,
 7.361194002442062e-05,
 8.991004142444581e-05,
 7.373999687843025e-05,
 7.406290387734771e-05,
 7.719092536717653e-05,
 7.397006265819073e-05,
 7.499696221202612e-05,
 7.419404573738575e-05,
 7.61030096327886e-05,
 7.64610740588978e-05,
 7.472001016139984e-05,
 7.476202154066414e-05,
 7.753005775157362e-05,
 7.680403359699994e-05,
 7.383717456832528e-05,
 7.278703560587019e-05,
 7.599900709465146e-05,
 7.594007183797657e-05,
 7.500892388634384e-05,
 7.457299216184765e-05,
 7.685089076403528e-05,
 7.588899461552501e-05,
 7.426305091939867e-05,
 7.493501470889896e-05,
 7.349888619501144e-05,
 7.317200652323663e-05,
 7.381290197372437e-05,
 7.481199281755835e-05,
 8.174002869054675e-05,
 8.157001866493374e-05,
 7.197697414085269e-05,
 7.250597991514951e-05,
 7.220394036266953e-05,
 7.171784818638116e-05,
 7.065302634146065e-05,
 7.110304431989789e-05,
 7.591898611281067e-05,
 7.133891631383449e-05,
 7.183999696280807e-05,
 7.131503662094474e-05,
 7.216405356302857e-05,
 7.195306534413248e-05,
 7.169505988713354e-05,
 7.214999641291797e-05,
 7.56269582780078e-05,
 7.284399180207402e-05,
 7.234996883198619e-05,
 7.149703742470592e-05,
 7.211408228613436e-05,
 7.122100214473903e-05,
 7.527804700657725e-05,
 7.034893496893346e-05,
 7.370096864178777e-05,
 7.04460107954219e-05,
 7.007802196312696e-05,
 7.111001468729228e-05,
 7.075097528286278e-05,
 7.097801426425576e-05,
 7.056501635815948e-05,
 7.020900375209749e-05,
 7.504298991989344e-05,
 7.211801130324602e-05,
 7.104291580617428e-05,
 7.198000093922019e-05,
 9.564011998008937e-05,
 8.324797090608627e-05,
 7.37859372748062e-05,
 7.2948940214701e-05,
 7.786012429278344e-05,
 7.285998435690999e-05,
 7.155805360525846e-05,
 7.089501013979316e-05,
 7.491899305023253e-05,
 7.089599967002869e-05,
 7.864700455684215e-05,
 7.055302558001131e-05,
 7.808998634573072e-05,
 7.091091538313776e-05,
 7.139802619349211e-05,
 6.985603249631822e-05,
 7.034494774416089e-05,
 7.188996823970228e-05,
 7.112904859241098e-05,
 7.071801519487053e-05,
 7.582698890473694e-05,
 7.325598562601954e-05,
 7.212703349068761e-05,
 7.396109867841005e-05,
 7.395395368803293e-05,
 9.131603292189538e-05,
 7.385702338069677e-05,
 7.41579569876194e-05,
 7.909006671980023e-05,
 7.360301970038563e-05,
 8.467190491501242e-05,
 7.44219432817772e-05,
 7.430004188790917e-05,
 7.335198461078107e-05,
 7.495496538467705e-05,
 7.723188900854439e-05,
 7.847690721973777e-05,
 7.314902904909104e-05,
 7.48899910831824e-05,
 7.631802873220295e-05,
 7.459994230885059e-05,
 7.430402911268175e-05,
 7.669896876905113e-05,
 0.00013297093391884118,
 7.988006109371781e-05,
 7.662203279323876e-05,
 7.595108763780445e-05,
 7.48160236980766e-05,
 8.854309271555394e-05,
 7.573309994768351e-05,
 8.637196151539683e-05,
 7.587701838929206e-05,
 7.899693446233869e-05,
 7.396709406748414e-05,
 7.504002132918686e-05,
 7.558398647233844e-05,
 7.601702236570418e-05,
 7.510001887567341e-05,
 7.52020423533395e-05,
 7.673402433283627e-05,
 7.874204311519861e-05,
 7.471600838471204e-05,
 7.496900798287243e-05,
 7.48330494388938e-05,
 7.522695523221046e-05,
 7.672021456528455e-05,
 7.563004328403622e-05,
 7.328591891564429e-05,
 7.787001959513873e-05,
 0.00010663915600162,
 7.402795017696917e-05,
 7.507603731937706e-05,
 7.68839381635189e-05,
 7.471698336303234e-05,
 7.454499427694827e-05,
 7.446402742061764e-05,
 7.827095396351069e-05,
 7.555694901384413e-05,
 7.470694254152477e-05,
 7.632003689650446e-05,
 7.464100781362504e-05,
 7.464202644769102e-05,
 7.583694241475314e-05,
 7.686104800086468e-05,
 8.053691999521106e-05,
 7.654711953364313e-05,
 8.343807712662965e-05,
 7.510989962611347e-05,
 7.439801993314177e-05,
 7.318300777114928e-05,
 7.391901453956962e-05,
 7.333606481552124e-05,
 7.73769716033712e-05,
 7.2818947955966e-05,
 7.273197115864605e-05,
 7.209095929283649e-05,
 7.395799912046641e-05,
 7.197009108494967e-05,
 7.294096576515585e-05,
 7.549408474005759e-05,
 7.811494288034737e-05,
 7.805009954608977e-05,
 7.428412209264934e-05,
 7.386000652331859e-05,
 7.42709671612829e-05,
 7.250900671351701e-05,
 7.320407894439995e-05,
 7.397591252811253e-05,
 8.064595749601722e-05,
 7.685791933909059e-05,
 8.389291178900748e-05,
 7.654001819901168e-05,
 0.00010594197374302894,
 7.745297625660896e-05,
 7.432496931869537e-05,
 7.471795834135264e-05,
 7.826299406588078e-05,
 7.417814049404114e-05,
 7.41769908927381e-05,
 7.299099524971098e-05,
 7.377799192909151e-05,
 7.407402154058218e-05,
 7.343098695855588e-05,
 7.353897672146559e-05,
 7.68039608374238e-05,
 7.54369975766167e-05,
 7.54280190449208e-05,
 8.256200817413628e-05,
 7.697306864429265e-05,
 7.50299368519336e-05,
 7.299697608686984e-05,
 7.20550597179681e-05,
 7.753803220111877e-05,
 7.331700180657208e-05,
 7.175588689278811e-05,
 7.394395652227104e-05,
 7.398200978059322e-05,
 7.361800817307085e-05,
 7.416607695631683e-05,
 7.366097997874022e-05,
 7.82070419518277e-05,
 7.442892820108682e-05,
 7.423995702993125e-05,
 7.379487215075642e-05,
 7.379498856607825e-05,
 7.40869581932202e-05,
 7.317801646422595e-05,
 7.438198372256011e-05,
 7.756099512334913e-05,
 7.365392229985446e-05,
 7.504693348892033e-05,
 7.483399531338364e-05,
 7.398502202704549e-05,
 7.542004459537566e-05,
 7.458703476004303e-05,
 7.505499524995685e-05,
 7.760099833831191e-05,
 7.207294402178377e-05,
 7.475203892681748e-05,
 7.426596130244434e-05,
 7.584701234009117e-05,
 7.477404142264277e-05,
 7.547713175881654e-05,
 7.527695561293513e-05,
 7.644700235687196e-05,
 7.293098315130919e-05,
 7.31930194888264e-05,
 7.382800686173141e-05,
 7.380000897683203e-05,
 7.297206320799887e-05,
 7.413899584207684e-05,
 7.702896255068481e-05,
 8.051899203564972e-05,
 7.583403203170747e-05,
 8.595801773481071e-05,
 7.632302003912628e-05,
 7.643208664376289e-05,
 7.610910688526928e-05,
 7.77160021243617e-05,
 9.400999988429248e-05,
 8.328401600010693e-05,
 9.144199430011213e-05,
 7.775703852530569e-05,
 7.793503755237907e-05,
 7.727995398454368e-05,
 7.607898442074656e-05,
 7.663507130928338e-05,
 7.649692997802049e-05,
 9.78780590230599e-05,
 7.773104880470783e-05,
 7.677101530134678e-05,
 7.712897786404938e-05,
 7.718204869888723e-05,
 7.639601244591177e-05,
 7.508799899369478e-05,
 7.40530522307381e-05,
 7.790201925672591e-05,
 7.365495548583567e-05,
 7.500206993427128e-05,
 7.455403101630509e-05,
 7.28590675862506e-05,
 7.785900379531085e-05,
 7.419609755743295e-05,
 7.418505265377462e-05,
 7.930492574814707e-05,
 7.419804751407355e-05,
 7.391899998765439e-05,
 8.397312194574624e-05,
 7.546595588792115e-05,
 8.023998816497624e-05,
 7.736001862213016e-05,
 7.521305815316737e-05,
 8.117796096485108e-05,
 7.77270324761048e-05,
 7.800190360285342e-05,
 7.638910028617829e-05,
 7.570593152195215e-05,
 7.579103112220764e-05,
 7.448205724358559e-05,
 7.80410337029025e-05,
 7.837200246285647e-05,
 7.530889706686139e-05,
 7.600603566970676e-05,
 7.389404345303774e-05,
 7.374395499937236e-05,
 7.379303860943764e-05,
 0.0001529400033177808,
 7.349591760430485e-05,
 7.8858996857889e-05,
 7.427502714563161e-05,
 8.555695239920169e-05,
 7.509299030061811e-05,
 7.7052041888237e-05,
 7.77129753259942e-05,
 8.051707118283957e-05,
 9.328106534667313e-05,
 0.00011146390170324594,
 7.507498958148062e-05,
 0.00012376105587463826,
 7.631098560523242e-05,
 7.812595868017524e-05,
 7.585898856632411e-05,
 7.709801138844341e-05,
 7.523801468778402e-05,
 8.038202940952033e-05,
 7.54579232307151e-05,
 7.782397733535618e-05,
 7.533897587563843e-05,
 7.525400724261999e-05,
 7.701999857090414e-05,
 7.579202065244317e-05,
 7.497901970054954e-05,
 7.942903903312981e-05,
 7.310199725907296e-05,
 7.360585732385516e-05,
 7.55651417421177e-05,
 7.737604028079659e-05,
 7.441798516083509e-05,
 7.509892748203129e-05,
 7.571709284093231e-05,
 7.91439670138061e-05,
 7.918203482404351e-05,
 7.584504783153534e-05,
 7.546006236225367e-05,
 7.539005309808999e-05,
 7.441395428031683e-05,
 7.505096436943859e-05,
 7.577006181236356e-05,
 9.117195440921932e-05,
 7.811507384758443e-05,
 7.894002192188054e-05,
 7.858702156227082e-05,
 7.819307211320847e-05,
 7.915600144769996e-05,
 7.695094973314553e-05,
 7.523901876993477e-05,
 8.923103450797498e-05,
 7.502903463318944e-05,
 7.304904283955693e-05,
 7.476398604921997e-05,
 8.436590724159032e-05,
 7.614100468344986e-05,
 7.509096758440137e-05,
 7.396205910481513e-05,
 7.727598131168634e-05,
 7.429096149280667e-05,
 7.459896733053029e-05,
 7.469195406883955e-05,
 7.465804810635746e-05,
 7.527302659582347e-05,
 7.382595504168421e-05,
 7.400305185001343e-05,
 7.740397995803505e-05,
 7.449706026818603e-05,
 7.515601464547217e-05,
 7.341701711993665e-05,
 7.34771165298298e-05,
 7.633307541254908e-05,
 7.65349977882579e-05,
 7.612796616740525e-05,
 8.055406215135008e-05,
 7.547797576989979e-05,
 7.477196049876511e-05,
 7.510004797950387e-05,
 7.53459898987785e-05,
 7.460506458301097e-05,
 7.656507659703493e-05,
 7.631110202055424e-05,
 7.847695087548345e-05,
 7.453697617165744e-05,
 7.521695806644857e-05,
 7.471803110092878e-05,
 7.575291965622455e-05,
 8.211896056309342e-05,
 7.565497071482241e-05,
 7.3407863965258e-05,
 7.740595901850611e-05,
 7.411796832457185e-05,
 7.369596278294921e-05,
 7.483296212740242e-05,
 7.60900293244049e-05,
 7.642494165338576e-05,
 7.731403457000852e-05,
 7.600404205732048e-05,
 8.019196684472263e-05,
 7.719703717157245e-05,
 8.904510468710214e-05,
 9.070891246665269e-05,
 8.732402056921273e-05,
 7.78440444264561e-05,
 8.173708920367062e-05,
 7.773896504659206e-05,
 8.214105037041008e-05,
 7.801398169249296e-05,
 7.653189823031425e-05,
 7.59959511924535e-05,
 8.992201765067875e-05,
 7.414401625283062e-05,
 7.421804184559733e-05,
 7.645704317837954e-05,
 7.927398837637156e-05,
 8.579394489061087e-05,
 7.706099131610245e-05,
 7.613396155647933e-05,
 7.495697354897857e-05,
 7.614903734065592e-05,
 7.411401020362973e-05,
 7.346292841248214e-05,
 7.972802268341184e-05,
 7.555604679509997e-05,
 7.49830505810678e-05,
 8.862606773618609e-05,
 7.667507452424616e-05,
 9.305107232648879e-05,
 7.893597648944706e-05,
 7.672312494833022e-05,
 8.168196654878557e-05,
 8.02459690021351e-05,
 7.996000931598246e-05,
 7.966197154019028e-05,
 7.919594645500183e-05,
 7.711799116805196e-05,
 7.838098099455237e-05,
 7.721697329543531e-05,
 8.036496001295745e-05,
 7.604810525663197e-05,
 7.711599755566567e-05,
 7.584296690765768e-05,
 7.612211629748344e-05,
 7.596195791848004e-05,
 8.602799789514393e-05,
 7.437502790708095e-05,
 7.804512279108167e-05,
 7.515994366258383e-05,
 7.618204108439386e-05,
 7.698402623645961e-05,
 7.725901377853006e-05,
 7.754987746011466e-05,
 8.658607839606702e-05,
 7.990816084202379e-05,
 8.232102845795453e-05,
 7.845611253287643e-05,
 7.95100349932909e-05,
 7.872807327657938e-05,
 7.712095975875854e-05,
 7.54259672248736e-05,
 7.570996240247041e-05,
 7.648600148968399e-05,
 7.890495180618018e-05,
 7.423006172757596e-05,
 7.57479720050469e-05,
 7.534005271736532e-05,
 0.00010186202416662127,
 7.752003148198128e-05,
 7.597697549499571e-05,
 7.540103979408741e-05,
 7.850397378206253e-05,
 8.329901902470738e-05,
 7.353998080361634e-05,
 7.400693721137941e-05,
 7.41019903216511e-05,
 7.292199006769806e-05,
 7.625004218425602e-05,
 7.445902156177908e-05,
 7.838189776521176e-05,
 7.690385973546654e-05,
 7.716099207755178e-05,
 7.508894486818463e-05,
 7.394305430352688e-05,
 7.731892401352525e-05,
 7.532001473009586e-05,
 8.295697625726461e-05,
 8.079904364421964e-05,
 7.804100459907204e-05,
 7.652697968296707e-05,
 7.748194911982864e-05,
 7.687801553402096e-05,
 8.003695984371006e-05,
 7.629705942235887e-05,
 7.597402145620435e-05,
 9.072404645849019e-05,
 7.885700324550271e-05,
 7.787397771608084e-05,
 7.882485806476325e-05,
 8.018899825401604e-05,
 7.745192851871252e-05,
 8.148302731569856e-05,
 8.070006151683629e-05,
 8.205293852370232e-05,
 7.642604759894311e-05,
 7.659001857973635e-05,
 7.529894355684519e-05,
 7.487001130357385e-05,
 7.363401527982205e-05,
 7.279097917489707e-05,
 7.328901847358793e-05,
 7.876090239733458e-05,
 7.601003744639456e-05,
 7.626206206623465e-05,
 7.553903560619801e-05,
 7.446098607033491e-05,
 7.642297714482993e-05,
 7.613093475811183e-05,
 7.48499296605587e-05,
 7.904396625235677e-05,
 7.64080323278904e-05,
 7.632595952600241e-05,
 7.708999328315258e-05,
 7.92830396676436e-05,
 7.752393139526248e-05,
 7.704191375523806e-05,
 7.93669605627656e-05,
 8.135092502925545e-05,
 7.791603275109082e-05,
 7.655084482394159e-05,
 7.616006769239902e-05,
 7.689400808885694e-05,
 7.611997716594487e-05,
 7.677101530134678e-05,
 7.703104347456247e-05,
 7.830098911654204e-05,
 7.629801984876394e-05,
 7.535501208622009e-05,
 7.556700438726693e-05,
 7.665687007829547e-05,
 7.544990512542427e-05,
 7.56260851630941e-05,
 7.53850326873362e-05,
 7.937304326333106e-05,
 7.520800863858312e-05,
 7.669099431950599e-05,
 8.43649759190157e-05,
 7.762295717839152e-05,
 7.885004743002355e-05,
 7.592393376398832e-05,
 9.468296775594354e-05,
 8.393017924390733e-05,
 7.75069638621062e-05,
 7.864888175390661e-05,
 7.631300832144916e-05,
 7.591296161990613e-05,
 7.466107490472496e-05,
 7.600597746204585e-05,
 7.6834941864945e-05,
 7.887912215664983e-05,
 7.457898755092174e-05,
 7.626698061358184e-05,
 8.100697596091777e-05,
 7.402896881103516e-05,
 7.468411058653146e-05,
 7.467599061783403e-05,
 7.328289211727679e-05,
 7.992098107933998e-05,
 7.358200673479587e-05,
 7.53570202505216e-05,
 7.467503019142896e-05,
 7.524904503952712e-05,
 7.552299939561635e-05,
 7.426702359225601e-05,
 7.539401121903211e-05,
 7.844105130061507e-05,
 7.444499351549894e-05,
 7.439509499818087e-05,
 7.471913704648614e-05,
 7.379711314570159e-05,
 7.352401735261083e-05,
 7.359203300438821e-05,
 7.537902274634689e-05,
 7.663802534807473e-05,
 7.429295510519296e-05,
 7.44840654078871e-05,
 7.545902917627245e-05,
 7.597202784381807e-05,
 7.548402936663479e-05,
 7.438697502948344e-05,
 7.531692972406745e-05,
 7.930801075417548e-05,
 7.595399802085012e-05,
 7.92580540291965e-05,
 7.546198321506381e-05,
 7.746995834168047e-05,
 7.42299307603389e-05,
 7.567601278424263e-05,
 8.728003012947738e-05,
 8.156403782777488e-05,
 7.664301665499806e-05,
 7.664796430617571e-05,
 0.00010824803030118346,
 7.76410597609356e-05,
 7.785999332554638e-05,
 7.686211029067636e-05,
 7.653413922525942e-05,
 7.920795178506523e-05,
 7.643293065484613e-05,
 7.782306056469679e-05,
 7.619804819114506e-05,
 7.519402424804866e-05,
 7.480599742848426e-05,
 9.891903027892113e-05,
 7.519089558627456e-05,
 7.841993647161871e-05,
 7.542296953033656e-05,
 7.46819277992472e-05,
 7.435597945004702e-05,
 7.500904030166566e-05,
 7.667698082514107e-05,
 7.747704512439668e-05,
 7.975890184752643e-05,
 7.977602945175022e-05,
 7.610292232129723e-05,
 7.663300493732095e-05,
 7.577991345897317e-05,
 7.709499914199114e-05,
 7.59399845264852e-05,
 7.754687976557761e-05,
 7.727707270532846e-05,
 8.027302101254463e-05,
 7.711390207987279e-05,
 7.531794835813344e-05,
 7.734907558187842e-05,
 7.462903158739209e-05,
 7.392192492261529e-05,
 7.388004451058805e-05,
 7.306403131224215e-05,
 7.663299038540572e-05,
 8.130109927151352e-05,
 7.201590051408857e-05,
 7.441992056556046e-05,
 7.226203160826117e-05,
 7.300899596884847e-05,
 7.283099694177508e-05,
 8.205408812500536e-05,
 7.625900616403669e-05,
 7.369305239990354e-05,
 7.288205961231142e-05,
 7.4219104135409e-05,
 7.4808020144701e-05,
 7.411003753077239e-05,
 7.336701673921198e-05,
 7.351198291871697e-05,
 8.784994133748114e-05,
 7.247892790473998e-05,
 7.306007319130003e-05,
 7.331100641749799e-05,
 7.128001016099006e-05,
 7.48849124647677e-05,
 7.352602551691234e-05,
 7.408004603348672e-05,
 7.755109982099384e-05,
 7.427910168189555e-05,
 7.297203410416842e-05,
 7.466509123332798e-05,
 7.225201989058405e-05,
 7.44279968785122e-05,
 7.335908594541252e-05,
 8.832300954964012e-05,
 7.722699956502765e-05,
 0.00011871707101818174,
 0.00010629298049025238,
 7.369702507276088e-05,
 9.05741035239771e-05,
 8.575496030971408e-05,
 7.612790795974433e-05,
 7.699795241933316e-05,
 8.00139969214797e-05,
 0.0001118859217967838,
 7.411709520965815e-05,
 7.418992754537612e-05,
 7.516387267969549e-05,
 7.475499296560884e-05,
 7.490903954021633e-05,
 0.00011531003110576421,
 8.762700599618256e-05,
 7.509301940444857e-05,
 7.562105020042509e-05,
 7.551301678176969e-05,
 7.431497215293348e-05,
 7.333203393500298e-05,
 7.515616016462445e-05,
 7.596086652483791e-05,
 7.602696132380515e-05,
 7.425200601574033e-05,
 7.594698399771005e-05,
 7.44340504752472e-05,
 7.64470751164481e-05,
 7.494093733839691e-05,
 7.576901407446712e-05,
 7.741613080725074e-05,
 8.65551846800372e-05,
 7.74930085754022e-05,
 8.58670100569725e-05,
 7.794699922669679e-05,
 7.713196100667119e-05,
 7.708009798079729e-05,
 7.7948032412678e-05,
 7.67450692364946e-05,
 9.773204510565847e-05,
 7.792195538058877e-05,
 7.51140178181231e-05,
 8.684709609951824e-05,
 7.638697570655495e-05,
 9.921098535414785e-05,
 7.794496195856482e-05,
 7.75300431996584e-05,
 8.183800673577935e-05,
 7.701897993683815e-05,
 7.849594112485647e-05,
 7.675396045669913e-05,
 7.563404506072402e-05,
 7.589699816890061e-05,
 7.398988236673176e-05,
 7.307193300221115e-05,
 8.593495294917375e-05,
 7.65580334700644e-05,
 7.916707545518875e-05,
 7.579299563076347e-05,
 7.567796274088323e-05,
 7.755900151096284e-05,
 7.573497714474797e-05,
 7.44329736335203e-05,
 7.827002264093608e-05,
 7.42109987186268e-05,
 7.466593524441123e-05,
 7.363400072790682e-05,
 7.376504072453827e-05,
 7.380405440926552e-05,
 9.23940388020128e-05,
 7.483300578314811e-05,
 8.047804294619709e-05,
 7.631593325641006e-05,
 7.538900536019355e-05,
 7.442991773132235e-05,
 7.65759905334562e-05,
 7.614401692990214e-05,
 7.588091830257326e-05,
 7.576395000796765e-05,
 7.870400440879166e-05,
 0.0001056540641002357,
 7.572909817099571e-05,
 7.496507896576077e-05,
 7.568500586785376e-05,
 7.498105696868151e-05,
 7.968007412273437e-05,
 8.509786857757717e-05,
 8.10629571788013e-05,
 7.600196113344282e-05,
 7.57930101826787e-05,
 7.549197471234947e-05,
 7.520495273638517e-05,
 7.360902964137495e-05,
 7.443001959472895e-05,
 9.630402200855315e-05,
 8.854689076542854e-05,
 7.479696068912745e-05,
 7.550187001470476e-05,
 7.410196121782064e-05,
 7.609296881128103e-05,
 7.334508700296283e-05,
 7.624299905728549e-05,
 7.569797162432224e-05,
 9.144601062871516e-05,
 7.598196680191904e-05,
 7.643000571988523e-05,
 7.461300992872566e-05,
 7.587400614283979e-05,
 7.33820052118972e-05,
 7.376709254458547e-05,
 7.33909837435931e-05,
 7.835993892513216e-05,
 7.409400132019073e-05,
 7.223493594210595e-05,
 7.309802458621562e-05,
 7.276007090695202e-05,
 7.412290142383426e-05,
 7.465593807864934e-05,
 7.410594844259322e-05,
 7.849496614653617e-05,
 7.395399734377861e-05,
 7.344300684053451e-05,
 7.290393114089966e-05,
 7.341298623941839e-05,
 7.294208626262844e-05,
 7.301905134227127e-05,
 7.281295256689191e-05,
 7.909993291832507e-05,
 7.330694643314928e-05,
 7.303505844902247e-05,
 7.222697604447603e-05,
 7.246992026921362e-05,
 7.231796917039901e-05,
 7.33270135242492e-05,
 7.565897249151021e-05,
 7.650507905054837e-05,
 7.329101208597422e-05,
 7.460499182343483e-05,
 7.392097904812545e-05,
 7.4343042797409e-05,
 7.314598769880831e-05,
 7.787597132846713e-05,
 7.497398473788053e-05,
 7.796002319082618e-05,
 7.375190034508705e-05,
 7.404999632854015e-05,
 7.262393773999065e-05,
 8.250400424003601e-05,
 7.519002247136086e-05,
 9.032999514602125e-05,
 7.372503750957549e-05,
 7.867701060604304e-05,
 7.553098839707673e-05,
 7.473891309928149e-05,
 7.398005982395262e-05,
 7.329002255573869e-05,
 7.495490717701614e-05,
 7.550093869213015e-05,
 7.632502820342779e-05,
 9.063900506589562e-05,
 7.974100299179554e-05,
 7.584398554172367e-05,
 7.743202149868011e-05,
 8.856307249516249e-05,
 8.922199776861817e-05,
 7.80628906795755e-05,
 0.00018091600213665515]
In [206]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(times, 'ro')
plt.show()

Accessing an element in a list by index always takes the same amount of time, regardless of position. I.e., indexing incurs a constant time delay.

How? A Python list uses an array as its underlying data storage mechanism. To access an element in an array, the interpreter:

  1. Computes an offset into the array by multiplying the element's index by the size of each array entry (which are uniformly sized, since they are merely references to the actual elements)
  2. Adds the offset to the base address of the array

Task: to locate an element with a given value in a list (array).

In [30]:
def index(lst, x):
    for i in range(len(lst)):
        if lst[i] == x:
            return i
    return -1
In [31]:
lst = list(range(100))

index(lst, 10)
Out[31]:
10
In [32]:
index(lst, 99)
Out[32]:
99
In [33]:
index(lst, -1)
Out[33]:
-1
In [20]:
#self-reading, error handling

def index(lst, x):
    for i in range(len(lst)):
        if lst[i] == x:
            return i
    raise ValueError(x)
In [ ]:
#index(lst, 10)
In [ ]:
#index(lst, -1)
In [ ]:
#self-reading, another way to handle error

try:
    print('Value found at', index(lst, -1))
except ValueError as e:
    print('Value not found:', e)
In [34]:
# timing linear search

import timeit

times = []
lst = list(range(1000))

for x in lst:
    times.append(timeit.timeit(stmt='index(lst, {})'.format(x),
                               globals=globals(),
                               number=100))
    
    #executing index(lst, x), index(lst, 0), index(lst, 1), index(lst, 2) ...
In [35]:
import matplotlib.pyplot as plt
plt.plot(times, 'ro')
plt.show()

Task: to locate an element with a given value in a list (array) whose contents are sorted in ascending order.

In [ ]:
# Binary Search Animation

# http://www.cs.armstrong.edu/liang/animation/web/BinarySearch.html
In [ ]:
def index(lst, x):
    # assume that lst is sorted!!!
    
    return None
In [36]:
def index(lst, x):
    # assume that lst is sorted!!!
    
    lo, mid, hi = 0, len(lst)//2, len(lst)
    
    while lo < hi:
        if x == lst[mid]:
            return mid
        elif x > lst[mid]:
            lo = mid + 1
        else: # x < lst[mid]
            hi = mid
        mid = (lo + hi) // 2
    else:
        return -1
    
In [37]:
lst = list(range(1000))
index(lst, 10)
Out[37]:
10
In [38]:
index(lst, 999)
Out[38]:
999
In [39]:
index(lst, -1)
Out[39]:
-1
In [172]:
#for i in range(len(lst)):
#    assert(i == index(lst, i))
In [42]:
import timeit

times = []
lst = list(range(1000))

for x in lst:
    times.append(timeit.timeit(stmt='index(lst, {})'.format(x),
                               globals=globals(),
                               number=1000))
In [43]:
import matplotlib.pyplot as plt
plt.plot(times, 'ro')
plt.show()
In [ ]:
# self-reading example

import timeit
import random

times = []

for size in range(100, 10000, 100):
    lst = list(range(size))
    times.append(timeit.timeit(stmt='index(lst, -1)'.format(random.randrange(size)),
                               globals=globals(),
                               number=50000))
In [ ]:
import matplotlib.pyplot as plt
plt.plot(times, 'ro')
plt.show()
In [50]:
# search for a value does not exist; worst case scenario

import timeit
import random

times = []

for e in range(5, 20):
    lst = list(range(2**e))
    times.append(timeit.timeit(stmt='index(lst, -1)',
                               globals=globals(),
                               number=200000))
In [46]:
#for i in range(5, 20):
 #   print(2**i)
In [51]:
import matplotlib.pyplot as plt
plt.plot(times, 'ro')
plt.show()

5. Insertion sort

Task: to sort the values in a given list (array) in ascending order.

In [52]:
import random

lst = list(range(1000))

random.shuffle(lst)
In [53]:
plt.plot(lst, 'ro')
plt.show()
In [ ]:
# Insertion sort animation

# http://cs.armstrong.edu/liang/animation/web/InsertionSort.html
In [ ]:
def insertion_sort(lst):
    pass
In [54]:
def insertion_sort(lst):
    for i in range(1, len(lst)):
        for j in range(i, 0, -1):
            if lst[j] < lst[j-1]: #do swap
                lst[j-1], lst[j] = lst[j], lst[j-1] #pythonic way to swap two values
            else:
                break
In [55]:
insertion_sort(lst)
In [56]:
plt.plot(lst, 'ro')
plt.show()
In [59]:
import timeit
import random

times = []

for size in range(100, 5000, 100):
    lst = list(range(size))
    times.append(timeit.timeit(stmt='insertion_sort(lst)',
                               setup='random.shuffle(lst)',
                               globals=globals(),
                               number=1))
In [60]:
plt.plot(times, 'ro')
plt.show()