Перебрать все строки фиксированной длины, состоящие из заданных символов Python

Имеется не оптимизированный код, который перебирает символы ABC ->
AAA AAB AAC ... ... CCA CCB CCC
Код работает отлично, но если поставить большое количество символов, выполнение кода будет долго ожидаемым. Требуется оптимизировать код, чтобы выполнялся на много быстрее . Попробовал сделать через njit но вылетела ошибка, и не знаю как исправить

'''Без модуля numba'''
from itertools import product
from time import perf_counter

Start = perf_counter()
kol = 0
for combos in product('ABC', repeat=3):
    S = ''.join(combos)
    kol = kol+1
    print(kol)
Stop = perf_counter()
print(Start + Stop)

'''C модулем numba'''

from itertools import product
from time import perf_counter
from numba import njit

@jit(parallel=True)
def test():
    kol = 0
    for combos in product('ABC', repeat=3):
        S = ''.join(combos)
        kol = kol+1
    print(kol)
Start = perf_counter()
test()
Stop = perf_counter()
print(Start + Stop)

Ответы (1 шт):

Автор решения: MaxU

Львиная доля времени уходит на печать на экран(print(...)):

In [257]: %%timeit
     ...: Start = perf_counter()
     ...: kol = 0
     ...: for combos in product('ABC', repeat=2):
     ...:     S = ''.join(combos)
     ...:     kol = kol+1
     ...:     print(kol)
     ...: Stop = perf_counter()
     ...: print(Start + Stop)
...

51.9 µs ± 6.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

теперь тоже самое без печати на экран:

In [258]: %%timeit
     ...: Start = perf_counter()
     ...: kol = 0
     ...: for combos in product('ABC', repeat=2):
     ...:     S = ''.join(combos)
     ...:     kol = kol+1
     ...: Stop = perf_counter()

1.62 µs ± 41 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

PS вместо печати на экран данные можно накапливать в списке или словаре. Вы сможете получить более качественный ответ если шире опишите задачу. Так будет понятно для чего вам генерировать эти строки и как оптимизировать процесс...

→ Ссылка