Python 保存itertools产品循环值,然后从上一个结果继续

Python 保存itertools产品循环值,然后从上一个结果继续,python,cryptography,itertools,brute-force,Python,Cryptography,Itertools,Brute Force,我用这段代码来破解一个简单的密码mycubana,但我想“暂停”itertools循环,以便在一段时间后,我可以从上次保存的itertools.product值开始恢复循环。有没有什么方法可以在不改变大量代码的情况下做到这一点 代码: 是的,其实很简单。使用您的环境和bruteforce的定义,以下代码将在生成的序列上执行两次10个候选项的运行: bf26_8 = bruteforce(string.ascii_lowercase, 8, 9) count = 0 for c in bf26

我用这段代码来破解一个简单的密码mycubana,但我想“暂停”itertools循环,以便在一段时间后,我可以从上次保存的
itertools.product
值开始恢复循环。有没有什么方法可以在不改变大量代码的情况下做到这一点

代码:


是的,其实很简单。使用您的环境和
bruteforce
的定义,以下代码将在生成的序列上执行两次10个候选项的运行:

bf26_8 = bruteforce(string.ascii_lowercase, 8, 9)

count = 0

for c in bf26_8:
    count += 1
    print(c)
    if count == 10:
        break

print("======== PAUSED ========")

for c in bf26_8:
    count += 1
    print(c)
    if count == 20:
        break

“技巧”是将
bruteforce
的结果存储在变量中。该结果是一个,因此,如果您对其进行迭代,但不耗尽它(即,打破迭代循环),则一旦您再次开始迭代,它将为您提供continuations值。

但我希望迭代一个长度为10的26个字符的列表,它将在完成之前耗尽内存,就像这篇帖子:我编辑了答案,告诉你不会发生爆炸。生成器(我在答案中添加了一个链接)并不预先创建整个结果序列,而是通过维护生成序列的代码和一些上下文(例如,程序指令指针和局部变量的值),支持序列生成的对象。
bf26_8 = bruteforce(string.ascii_lowercase, 8, 9)

count = 0

for c in bf26_8:
    count += 1
    print(c)
    if count == 10:
        break

print("======== PAUSED ========")

for c in bf26_8:
    count += 1
    print(c)
    if count == 20:
        break