我可以在 python 上暂停 itertools 并稍后恢复吗?

Can I pause itertools on python, and resume later?

我需要创建一个字符串列表,其中包含所有字母大写和小写的所有可能组合,具有不重复的字符,长度为 14,这非常庞大,我知道这会花费很多时间 space。 我现在的代码是这样的:

import itertools

filename = open("strings.txt", "w")

for com in itertools.permutations('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 14):
    filename.write("\n"+"1_"+"".join(com)+"\n"+"0_"+"".join(com))
    print ("".join(com))

非常基本,它完成了工作,但我还没有找到更快的方法(尝试了 java 算法,我发现它似乎更快,但 python 更快) 由于这会花费很长时间,所以我有时需要关闭计算机,所以我需要能够保存在我离开的地方并继续,否则我每次都会从头开始 crashes/turn关闭我的电脑/发生任何事情。 有什么办法吗?

您可以 pickle 该迭代器对象。它的内部状态将存储在 pickle 文件中。当你恢复时,它应该从它停止的地方开始。

像这样:

import itertools
import os
import pickle
import time

# if the iterator was saved, load it
if os.path.exists('saved_iter.pkl'):
    with open('saved_iter.pkl', 'rb') as f:
        iterator = pickle.load(f)
# otherwise recreate it
else:
    iterator = itertools.permutations('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 14)

try:
    for com in iterator:
        # process the object from the iterator
        print(com)
        time.sleep(1.0)
except KeyboardInterrupt:
    # if the script is about to exit, save the iterator state
    with open('saved_iter.pkl', 'wb') as f:
        pickle.dump(iterator, f)

这导致:

>python so_test.py
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'o')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'p')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'q')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'r')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 's')

>python so_test.py
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 't')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'u')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'v')
('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'w')