#!/usr/bin/env python import random import sys import timeit def repeated_remove(l, i): try: while 1: l.remove(i) except ValueError: pass return l def old_remove(l, i): newList = [] for item in l: if item != i: newList.append(item) return newList def ghetto_remove(l, i): pos = 0 for unused in xrange(len(l)): if l[pos] == i: del l[pos] else: pos += 1 return l def comp_remove(l, i): return [item for item in l if item != i] def hard_remove(l, i): pos = 0 try: while 1: foundIndex = l[pos:].index(i) del l[pos + foundIndex] pos += foundIndex except ValueError: pass return l def randList(randMax, count): ''' return a random list of count elements ''' retVal = [] for i in xrange(count): retVal.append(random.randrange(randMax)) return retVal def main(argv=None): if argv is None: argv = sys.argv[:] removals = [repeated_remove, old_remove, ghetto_remove, comp_remove, hard_remove] times = {} for i in xrange(50): for removeFunc in removals: myList = randList(int(argv[1]), int(argv[2])) t = timeit.Timer(stmt='listremove.%s(%s, %s)' % (removeFunc.__name__, myList, myList[0]), setup="import listremove") times.setdefault(removeFunc.__name__, []) times[removeFunc.__name__].append(t.timeit(100)) print "%-16s%-9s%-9s%-9s%-9s" % ("name", "min", "max", "mean", "median") for k, v in times.items(): v.sort() min = v[0] max = v[-1] avg = sum(v) * 1.0 / len(v) median = v[len(v) / 2] print "%-16s%-9f%-9f%-9f%-9f" % (k, min, max, avg, median) if __name__ == '__main__': main()