fork(1) download
  1. # Generate successive k-length permutations.
  2.  
  3. def permutations(iterable, k=None):
  4. def detail(a, k):
  5. if k == 0:
  6. yield ()
  7. else:
  8. for i, first in enumerate(a):
  9. for rest in detail(a[:i] + a[i+1:], k-1):
  10. yield (first, *rest)
  11. a = list(iterable)
  12. return detail(a, len(a) if k is None else k)
  13.  
  14. # Test.
  15.  
  16. import itertools
  17. import time
  18.  
  19. n = 3
  20. a = list(range(n))
  21. for k in range(2+len(a)):
  22. print(list(permutations(a, k)))
  23. print(list(itertools.permutations(a, k)))
  24.  
  25. def test(f, a):
  26. t = time.process_time()
  27. for _ in f(a):
  28. pass
  29. t = time.process_time() - t
  30. print('Elapsed: {:.6f}s'.format(t))
  31. m = sum(1 for _ in f(a))
  32. n = sum(1 for _ in itertools.permutations(a))
  33. assert m == n
  34. for x, y in zip(f(a), itertools.permutations(a)):
  35. assert x == y
  36.  
  37. n = 8
  38. a = list(range(n))
  39. test(permutations, a)
  40. test(itertools.permutations, a)
Success #stdin #stdout 0.5s 14148KB
stdin
Standard input is empty
stdout
[()]
[()]
[(0,), (1,), (2,)]
[(0,), (1,), (2,)]
[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
[(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
[(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]
[]
[]
Elapsed: 0.143499s
Elapsed: 0.002776s