## Question:

Place the following functions below in order of their efficiency. They all take in a list of numbers between 0 and 1. The list can be quite long. An example input list would be `[random.random() for i in range(100000)]`. How would you prove that your answer is correct?

``````
def f1(lIn):
l1 = sorted(lIn)
l2 = [i for i in l1 if i<0.5]
return [i*i for i in l2]

def f2(lIn):
l1 = [i for i in lIn if i<0.5]
l2 = sorted(l1)
return [i*i for i in l2]

def f3(lIn):
l1 = [i*i for i in lIn]
l2 = sorted(l1)
return [i for i in l1 if i<(0.5*0.5)]``````

Most to least efficient: `f2``f1``f3`. To prove that this is the case, you would want to profile your code. Python has a lovely profiling package that should do the trick.

``````import cProfile
lIn = [random.random() for i in range(100000)]
cProfile.run('f1(lIn)')
cProfile.run('f2(lIn)')
cProfile.run('f3(lIn)')
``````

For completion's sake, here is what the above profile outputs:

``````>>> cProfile.run('f1(lIn)')
4 function calls in 0.045 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1    0.009    0.009    0.044    0.044 :1(f1)
1    0.001    0.001    0.045    0.045 :1()
1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
1    0.035    0.035    0.035    0.035 {sorted}

>>> cProfile.run('f2(lIn)')
4 function calls in 0.024 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1    0.008    0.008    0.023    0.023 :1(f2)
1    0.001    0.001    0.024    0.024 :1()
1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
1    0.016    0.016    0.016    0.016 {sorted}

>>> cProfile.run('f3(lIn)')
4 function calls in 0.055 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1    0.016    0.016    0.054    0.054 :1(f3)
1    0.001    0.001    0.055    0.055 :1()
1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
1    0.038    0.038    0.038    0.038 {sorted}``````

Keywords: