Перебрать все строки фиксированной длины, состоящие из заданных символов 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 шт):
Львиная доля времени уходит на печать на экран(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 вместо печати на экран данные можно накапливать в списке или словаре. Вы сможете получить более качественный ответ если шире опишите задачу. Так будет понятно для чего вам генерировать эти строки и как оптимизировать процесс...