import functools import random import sys import timeit if sys.version_info < (3, 0): range = xrange def revind(L, n): indices = [index for index, item in enumerate(L) if item==n] for index in reversed(indices): del L[index] def whiledel(L, n): i = 0 while i < len(L): if L[i] == n: del L[i] # Do not increment i here, because L[i] will change else: i += 1 def slide(L, n): # indices takes *worse-case* O(N) space, but typical-case much less indices = [i for i, x in enumerate(L) if x==n] indices_seen = 0 num_indices = len(indices) for i in range(len(L)): if (indices_seen < num_indices and i + indices_seen == indices[indices_seen]): indices_seen += 1 if i+indices_seen >= len(L): break L[i] = L[i+indices_seen] L[-indices_seen:] = [] def genexpr(L, n): L[:] = (i for i in L if i != n) def listcomp(L, n): L[:] = [i for i in L if i != n] if sys.version_info < (3, 0): def filterer(L, n): L[:] = filter(lambda i: i != n, L) else: def filterer(L, n): L[:] = filter(n.__ne__, L) def remove(L, n): while True: try: L.remove(n) except ValueError: break def removein(L, n): while n in L: L.remove(n) maxnum = int(sys.argv[1]) if len(sys.argv) > 1 else 16 listlen = int(sys.argv[2]) if len(sys.argv) > 2 else 1000000 reps = int(sys.argv[3]) if len(sys.argv) > 3 else 3 L0 = [random.randrange(maxnum) for _ in range(listlen)] for f in revind, whiledel, slide, genexpr, listcomp, filterer, remove, removein: L = L0[:] p = functools.partial(f, L, 0) print('{}: {} ({})'.format(f.__name__, timeit.timeit(p, number=reps), len(L)))