fork download
  1. import string
  2. from itertools import product, chain
  3. from string import ascii_lowercase
  4. from timeit import timeit
  5.  
  6.  
  7. def _calc_edits1(word):
  8. splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
  9. deletes = [a + b[1:] for a, b in splits if b]
  10. transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b) > 1]
  11. replaces = [a + c + b[1:] for a, b in splits for c in
  12. string.ascii_lowercase if b]
  13. inserts = [a + c + b for a, b in splits for c in
  14. string.ascii_lowercase]
  15. return set(deletes + transposes + replaces + inserts)
  16.  
  17.  
  18. def _split_word(word):
  19. return ((word[:i], word[i:]) for i in range(len(word) + 1))
  20.  
  21.  
  22. def _calc_edits2(word):
  23. form_2, form_3, form_4 = "{}{}".format, "{}{}{}".format, "{}{}{}{}".format
  24.  
  25. deletes = (form_2(a, b[1:]) for a, b in _split_word(word) if b)
  26. transposes = (form_4(a, b[1], b[0], b[2:])
  27. for a, b in _split_word(word) if len(b) > 1)
  28. replaces = (form_3(a, c, b[1:]) for a, b in _split_word(word) if b for c in
  29. ascii_lowercase)
  30. inserts = (form_3(a, c, b)
  31. for (a, b), c in product(_split_word(word), ascii_lowercase))
  32.  
  33. return set(chain(deletes, transposes, replaces, inserts))
  34.  
  35.  
  36. print(timeit("_calc_edits1('Welcome')",
  37. "from __main__ import _calc_edits1", number=10000))
  38.  
  39. print(timeit("_calc_edits2('Welcome')",
  40. "from __main__ import _calc_edits2", number=10000))
  41.  
Success #stdin #stdout 4.81s 7840KB
stdin
Standard input is empty
stdout
1.61750102043
3.21097898483