def ss(s): return s.lower().strip() # --------------------------------------------------- def f1(L, e): e = ss(e) for item in L: if ss(item) == e: L.remove(item) return raise ValueError, "%r not in list" % e # --------------------------------------------------- class CaseInsensitiveString(object): def __init__(self, s): self.s = s def __cmp__(self, other): return cmp(self.s.lower(), other.lower()) def f2(L, e): L.remove(CaseInsensitiveString(e)) # --------------------------------------------------- class CaseInsensitiveString2(object): def __init__(self, s): self.s = s self.s_lower = s.lower() def __cmp__(self, other): return cmp(self.s_lower, other.lower()) def f3(L, e): L.remove(CaseInsensitiveString2(e)) # --------------------------------------------------- def f4(L,e): e = e.lower() L = [x for x in L if x.lower() != e] # --------------------------------------------------- def f5(L,e): e_lower = e.lower() c = len(L) L = [x for x in L if x.lower() != e_lower] if not len(L) < c: raise ValueError, "%r not in list" % e # --------------------------------------------------- def f6(L, e): element = ss(e) for idx, item in enumerate(L): if ss(item) == e: del L[idx] return raise ValueError, "%r not in list" % element # --------------------------------------------------- import string tests = ( ('a', list('ABC')), ('a', list(string.uppercase)), ('b', list('ABC')), ('m', list(string.uppercase)), ('c', list('ABC')), ('z', list(string.uppercase)), ('z', list(string.uppercase*10)), ('end', list(string.uppercase*2)+['End']), ('end', list(string.uppercase*2)+['End']), ('end', list(string.uppercase*100)+['End']), ('end', list(string.uppercase*100)+['End']), ) for e, pL in tests: for f in f1, f2, f3, f4, f5, f6: L = pL[:] try: f(L, e) # makes sure they all work except ValueError: print "FAILED" print e print L raise ValueError from time import time T=0 for f in f1, f2, f3, f4, f5, f6: t=0 for e, pL in tests*100: t0 = time() f(pL[:], e) t += time()-t0 # failure case t0 = time() try: f(pL[:], 'nope') except ValueError: t += time()-t0 print f.func_name, t T += t print "total time", T