Поэтому я подумал, что было бы неплохо, если бы я запустил свою программу до 10000-го элемента в итераторе, а затем сохранил ее состояние.В следующий раз, когда я запускаю программу, она продолжается от 10001-го элемента итератора.
Вам повезло, потому что у itertools.combinations_with_replacement
объектов есть API, позволяющие установить состояние.Это используется модулем copy
в Python, но нет никаких причин, по которым вы также не можете подключиться.
Например, элемент 10,001 th будетбудь это:
>>> all_possible = itertools.combinations_with_replacement(POSSIBLE_CHARS, 29)
>>> for i in range(10_000):
... next(all_possible)
...
>>> "".join(next(all_possible))
'aaaaaaaaaaaaaaaaaaaaaaaaaafwI'
Чтобы «перемотать вперед» к этому предмету в новом экземпляре, было бы:
>>> new_iterator = itertools.combinations_with_replacement(POSSIBLE_CHARS, 29)
>>> state = (0,)*26 + (5, 22, 33)
>>> new_iterator.__setstate__(state)
>>> "".join(next(new_iterator))
'aaaaaaaaaaaaaaaaaaaaaaaaaafwI'
>>> "".join(next(new_iterator))
'aaaaaaaaaaaaaaaaaaaaaaaaaafwJ'
>>> new_iterator.__setstate__(state) # bonus: rewind iterator!
>>> "".join(next(new_iterator))
'aaaaaaaaaaaaaaaaaaaaaaaaaafwI'
Чтобы понять, почему комбинация 10,001 соответствует некоторому кортежудлина 29, как (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 5, 22, 33), я предлагаю вам просмотреть источники CPython , чтобы увидеть, как комбинации объектов позволяют копировать себя с сохранением состояния , а также соответствующий раздел * 1022.* docs .
Если вам не требуется защита от ошибочных или злонамеренно сконструированных данных, то вы можете просто выбрать такие итераторы для файла, а не подключать метод __setstate__
вручную.