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)))