Окончательный ответ (с предложением @ jq170727) следующий код:
import string
from tqdm.auto import trange, tqdm
from itertools import permutations
Запрошенный генератор (в google colab, с использованием TPU: около 10 Кб / с)
def combined(lst, lenStart, lenEnd):
for i in trange(lenStart, lenEnd + 1, desc='Progress'):
for subset in tqdm(permutations(lst, i), desc='Subsets', leave = False):
w = ''.join(map(str, subset))
yield w
И вот мы получили тот же генератор с большей эффективностью (на Google Colab, используя TPU: около 950k / s)
def compress_permutation(lst, lenStart, lenEnd):
yield ','.join([''.join(map(str, subset)) for i in trange(lenStart, lenEnd + 1, desc='Progress') for subset in tqdm(permutations(lst, i), desc='Subsets', leave = False)])
iterable = list(string.printable[:94])
lenStart, lendEnd = 1, 9
for subset in compress_permutation(iterable, l1, l2):
with open('passwords.txt', 'a') as f:
f.write(subset)