我正在写一个简单的rar / zip破解程序。为了破解密码,我准备了一个排列命令。但是当我运行这些代码时:
>>> import itertools
>>> o = itertools.permutations("abcdefghijklmnoprstuvyzwxq1234567890_", 10)
>>> a = list(o)
我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
答案 0 :(得分:3)
<强> UPD:强>
首先,如果您想从此字母表中获取所有可能的密码,则应使用product
模块中的itertools
函数而不是permutations
。
此外,如果您想提高执行速度,则应使用multiprocessing
模块而不是threading
。
您可以通过这种方式实现目标,例如:
from itertools import product, islice
from multiprocessing import Pool
def crack(list_of_tuples):
for letters in list_of_tuples:
password = ''.join(letters)
success = try_to_crack(password)
if success:
print('password is {}'.format(password))
break
tuples = product('abcdefghijklmnoprstuvyzwxq1234567890_', repeat=10)
size_of_slice = 5000
number_of_processes = 8
running = True
while running:
p = Pool(number_of_processes)
slices = []
for i in range(number_of_processes):
l = list(islice(tuples, size_of_slice))
if l:
slices.append(l)
else:
running = False
p.map(crack, slices)
另见multiprocessing-vs-threading
原始回答:
不要创建列表,只需按原样使用它:
permutations = itertools.permutations("abcdefghijklmnoprstuvyzwxq1234567890_", 10)
for permutation in permutations:
password = ''.join(permutation)
success = try_to_crack(password)
if success:
print('password is {}'.format(password))
break
答案 1 :(得分:1)
不要创建&#34;列表&#34;排列。 &#34;排列&#34; call是一个特殊的构造,它将一次生成一个排列 - 这个想法是你使用它,然后检索下一个值。
当你这样做时
>>> a = list(o)
您希望在内存中一次记录所有值 - 在这种情况下这是不够的。
作为旁注 - 如果你确实一次产生一个排列,你就会失去记忆,但是你,你的计算机,太阳系和整个宇宙一般都会用完。