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
我有一个非常大的产品,需要 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