如何避免Python中关于置换的MemoryError

2024-09-28 22:02:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个简单的rar/zip破解程序。为了破解他们的密码,我准备了一个排列命令。但当我运行这些代码时:

>>> import itertools
>>> o = itertools.permutations("abcdefghijklmnoprstuvyzwxq1234567890_", 10)
>>> a = list(o)

我有个错误:

^{pr2}$

Tags: 代码import命令程序密码错误ziplist
2条回答

不要创建排列的“列表”。 “permutations”调用是一种特殊的构造,tat将一次生成一个置换,其思想是使用它,然后检索下一个值。在

当你这么做的时候

>>> a = list(o)

您希望一次将所有值记录在内存中—在本例中这是不够的。在

作为一个旁注-如果你真的一次产生一个排列,你将耗尽内存,但你,你的计算机,太阳系和整个宇宙将耗尽时间。在

升级版:

首先,如果您想从这个字母表中获取所有可能的密码,您应该使用来自itertools模块的product函数,而不是{}。在

另外,如果您想提高执行速度,您应该使用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

原始答案:

不要创建列表,只需按原样使用:

^{pr2}$

相关问题 更多 >