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

问题描述 投票:2回答:2

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

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

我收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
python permutation itertools
2个回答
4
投票

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

2
投票

不要创建排列的“列表”。“排列”调用是一种特殊的构造,tat一次将生成一个排列-这个想法是您使用它,然后检索下一个值。

执行时

>>> a = list(o)

您想一次将所有值记录在内存中-在这种情况下,这是不够的。

作为旁注-如果在您的特定示例中一次生成一个排列,您将耗尽内存,但是您,您的计算机,太阳系和宇宙一般都将耗尽时间,因为30个左右中的10个元素的组合数量超出了天文数字。

© www.soinside.com 2019 - 2024. All rights reserved.