#!/usr/bin/env python

import timeit, random, time, sys, itertools

rand = random.Random(time.time())
randint = lambda: rand.randint(1, 100)

oldlist = [randint() for x in range(1, 100)]

def oldway():
    mylist = []
    for item in oldlist:
        if item < 50:
            mylist.append(item)
    return mylist

def cmp(x): return x < 50
def functional():
    return filter(cmp, oldlist)

def iter_():
    return list(itertools.ifilter(cmp, oldlist))

def newway():
    return [item for item in oldlist if item < 50]

ow = oldway()
fn = functional()
it = iter_()
nw = newway()

if not ow == fn == nw == it:
    print "Sanity check failed!  Lists are not the same"
    sys.exit(-1)

ot = timeit.Timer('oldway()', 'from __main__ import oldway')
fn = timeit.Timer('functional()', 'from __main__ import functional')
nw = timeit.Timer('newway()', 'from __main__ import newway')
it = timeit.Timer('iter_()', 'from __main__ import iter_')

print "running oldway() 100000 times ...",
sys.stdout.flush()
print ot.timeit(100000)
print "running functional() 100000 times ...",
sys.stdout.flush()
print fn.timeit(100000)
print "running itertools way (iter_) 100000 times ...",
sys.stdout.flush()
print it.timeit(100000)
print "running newway() 100000 times ...",
sys.stdout.flush
print nw.timeit(100000)