Python itertools 产品从某些开始

Python itertools product start from certain

我有一个非常大的产品,需要 itertools.product。

for result in product(items, repeat=9):
    # stuff

这需要很多时间,我正在寻找一种从某个项目开始的方法,因为我无法在一个项目上完成它 运行。

我可以做到以下几点:

gen = product(items, repeat=9):
for temp in gen:
    if temp == DESIRED_VALUE:
        break
for result in gen:
    # stuff

但这会花费很多时间,几乎和我刚刚重启程序一样。那么,有没有一种方法可以 "skip ahead" 而不浪费时间迭代整个事情?

虽然我一开始就非常担心暴力破解密码,但我可以提供一个答案。

您可以使用islice 跳过一定数量的迭代步骤。这意味着您将需要跟踪到目前为止您已进行了多少次尝试,以便知道以后从哪里恢复。

START_VALUE = 200
all_combos = itertools.product(letters,repeat=9)

#start at START_VALUE and stop at None (the end)
combos = itertools.islice(all_combos,START_VALUE,None)

for i,password in enumerate(combos,start=START_VALUE):
    ...

请注意,这仅适用于 以下 sys.maxsize.

的值

您还可以使用相同的公式计算给定密码的索引以转换基数:

def check_value(password):
    pos = len(letters)
    value = 0
    for i,c in enumerate(reversed(password)):
        value+= (pos**i) * letters.index(c)
    return value


>>> check_value("aaaacbdaa")
29802532