from timeit import repeat from string import printable frm, to = 'abcdefg', '0123456' btrans = bytes.maketrans(frm.encode('ascii'), to.encode('ascii')) strans = str.maketrans(frm, to) stgt = printable * 10 btgt = stgt.encode('ascii') replacements = tuple(f+t for f, t in zip(frm, to)) def replace_trans(x): for f, t in replacements: x = x.replace(f, t) return x print("\nTesting 1-1 translation") expected = stgt.translate(strans) assert(expected == btgt.translate(btrans).decode('ascii')) assert(expected == stgt.translate(btrans)) assert(expected == stgt.encode("latin-1").translate(btrans).decode("latin-1")) assert(expected == replace_trans(stgt)) print('bytes.translate', min(repeat('btgt.translate(btrans)', 'from __main__ import btrans, btgt', repeat=5, number=10000))) print('str.translate', min(repeat('stgt.translate(strans)', 'from __main__ import strans, stgt', repeat=5, number=10000))) print('str.translate from bytes trans', min(repeat('stgt.translate(btrans)', 'from __main__ import btrans, stgt', repeat=5, number=10000))) print('str.encode->bytes.translate->bytes.decode', min(repeat('stgt.encode("latin-1").translate(btrans).decode("latin-1")', 'from __main__ import btrans, stgt', repeat=5, number=10000))) print('str.replace', min(repeat('replace_trans(stgt)', 'from __main__ import replace_trans, stgt', repeat=5, number=10000))) del strans, btrans, frm, to frm, to = 'abcdefg', [None] * 7 strans = str.maketrans(dict(zip(frm, to))) bdel = frm.encode('ascii') replacements = tuple((f, '' if t is None else t) for f, t in zip(frm, to)) def replace_trans(x): for f, t in replacements: x = x.replace(f, t) return x print("\nTesting deletion") expected = stgt.translate(strans) assert(expected == btgt.translate(None, bdel).decode('ascii')) assert(expected == stgt.encode("latin-1").translate(None, bdel).decode("latin-1")) assert(expected == replace_trans(stgt)) print('bytes.translate', min(repeat('btgt.translate(None, bdel)', 'from __main__ import bdel, btgt', repeat=5, number=10000))) print('str.translate', min(repeat('stgt.translate(strans)', 'from __main__ import strans, stgt', repeat=5, number=10000))) print('str.encode->bytes.translate->bytes.decode', min(repeat('stgt.encode("latin-1").translate(None, bdel).decode("latin-1")', 'from __main__ import bdel, stgt', repeat=5, number=10000))) print('str.replace', min(repeat('replace_trans(stgt)', 'from __main__ import replace_trans, stgt', repeat=5, number=10000))) del strans, bdel, frm, to frm, to = 'abcdefg', ['01', '23', '45', '67', '89', None, None] strans = str.maketrans(dict(zip(frm, to))) replacements = tuple((f, '' if t is None else t) for f, t in zip(frm, to)) def replace_trans(x): for f, t in replacements: x = x.replace(f, t) return x print("\nTesting enlarging translations") expected = stgt.translate(strans) assert(expected == replace_trans(stgt)) print('str.translate', min(repeat('stgt.translate(strans)', 'from __main__ import strans, stgt', repeat=5, number=10000))) print('str.replace', min(repeat('replace_trans(stgt)', 'from __main__ import replace_trans, stgt', repeat=5, number=10000)))