def del_dups(seq):
seen = {}
pos = 0
for item in seq:
if item not in seen:
seen[item] = True
seq[pos] = item
pos += 1
del seq[pos:]
def del_dups_set(seq):
seen = set()
seen_add = seen.add
pos = 0
for item in seq:
if item not in seen:
seen_add(item)
seq[pos] = item
pos += 1
del seq[pos:]
def del_dups_fromkeys(seq):
seq[:] = dict.fromkeys(seq)
lst = [8, 8, 9, 9, 7, 15, 15, 2, 20, 13, 2, 24, 6, 11, 7, 12, 4, 10, 18,
13, 23, 11, 3, 11, 12, 10, 4, 5, 4, 22, 6, 3, 19, 14, 21, 11, 1,
5, 14, 8, 0, 1, 16, 5, 10, 13, 17, 1, 16, 17, 12, 6, 10, 0, 3, 9,
9, 3, 7, 7, 6, 6, 7, 5, 14, 18, 12, 19, 2, 8, 9, 0, 8, 4, 5]
def measure(func):
from timeit import Timer
N = 50000
setup = 'from __main__ import lst, del_dups, del_dups_set, del_dups_fromkeys'
t = Timer('%s(lst[:])' % (func,), setup)
print("%s: %.2f us" % (func, 1e6*min(t.repeat(number=N))/N,))
if __name__=="__main__":
measure('del_dups')
measure('del_dups_set')
measure('del_dups_fromkeys')
ZGVmIGRlbF9kdXBzKHNlcSk6CiAgICBzZWVuID0ge30KICAgIHBvcyA9IDAKICAgIGZvciBpdGVtIGluIHNlcToKICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWVuOgogICAgICAgICAgICBzZWVuW2l0ZW1dID0gVHJ1ZQogICAgICAgICAgICBzZXFbcG9zXSA9IGl0ZW0KICAgICAgICAgICAgcG9zICs9IDEKICAgIGRlbCBzZXFbcG9zOl0KCmRlZiBkZWxfZHVwc19zZXQoc2VxKToKICAgIHNlZW4gPSBzZXQoKQogICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgcG9zID0gMAogICAgZm9yIGl0ZW0gaW4gc2VxOgogICAgICAgIGlmIGl0ZW0gbm90IGluIHNlZW46CiAgICAgICAgICAgIHNlZW5fYWRkKGl0ZW0pCiAgICAgICAgICAgIHNlcVtwb3NdID0gaXRlbQogICAgICAgICAgICBwb3MgKz0gMQogICAgZGVsIHNlcVtwb3M6XQogICAgCmRlZiBkZWxfZHVwc19mcm9ta2V5cyhzZXEpOgoJc2VxWzpdID0gZGljdC5mcm9ta2V5cyhzZXEpCgpsc3QgPSBbOCwgOCwgOSwgOSwgNywgMTUsIDE1LCAyLCAyMCwgMTMsIDIsIDI0LCA2LCAxMSwgNywgMTIsIDQsIDEwLCAxOCwKICAgICAgIDEzLCAyMywgMTEsIDMsIDExLCAxMiwgMTAsIDQsIDUsIDQsIDIyLCA2LCAzLCAxOSwgMTQsIDIxLCAxMSwgMSwKICAgICAgIDUsIDE0LCA4LCAwLCAxLCAxNiwgNSwgMTAsIDEzLCAxNywgMSwgMTYsIDE3LCAxMiwgNiwgMTAsIDAsIDMsIDksCiAgICAgICA5LCAzLCA3LCA3LCA2LCA2LCA3LCA1LCAxNCwgMTgsIDEyLCAxOSwgMiwgOCwgOSwgMCwgOCwgNCwgNV0KCmRlZiBtZWFzdXJlKGZ1bmMpOgogICAgZnJvbSB0aW1laXQgaW1wb3J0IFRpbWVyCgogICAgTiA9IDUwMDAwCiAgICBzZXR1cCA9ICdmcm9tIF9fbWFpbl9fIGltcG9ydCBsc3QsIGRlbF9kdXBzLCBkZWxfZHVwc19zZXQsIGRlbF9kdXBzX2Zyb21rZXlzJwogICAgdCA9IFRpbWVyKCclcyhsc3RbOl0pJyAlIChmdW5jLCksIHNldHVwKQogICAgcHJpbnQoIiVzOiAlLjJmIHVzIiAlIChmdW5jLCAxZTYqbWluKHQucmVwZWF0KG51bWJlcj1OKSkvTiwpKQoKaWYgX19uYW1lX189PSJfX21haW5fXyI6CiAgICBtZWFzdXJlKCdkZWxfZHVwcycpCiAgICBtZWFzdXJlKCdkZWxfZHVwc19zZXQnKQogICAgbWVhc3VyZSgnZGVsX2R1cHNfZnJvbWtleXMnKQ==