python - 如何在 Python 中避免关于排列的内存错误

标签 python permutation python-itertools

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

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

我遇到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

最佳答案

更新:

首先,如果你想从这个字母表中获取所有可能的密码,你应该使用 itertools 模块中的 product 函数而不是 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

关于python - 如何在 Python 中避免关于排列的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687688/

相关文章:

python - 如何将 float 打印到 n 位小数,包括尾随 0?

scheme - 如何在 Scheme 中重复生成特定大小的所有排列?

python - 在Python中计算集合中的大量数字的有效方法?

python-3.x - 如何获得字符串(元音或辅音)的组合?

Python Itertools 字符串排列

python - 将相同的键值附加到字典列表中

python - Cmd 和 Git bash 在运行 Python 代码时有不同的结果

python - 如何在python中生成数组的排列?

python - 如何按条件键对二维列表进行分组?

python - 使用 headless 浏览器呈现 100,000 个页面,aws 上每秒每个 cpu 的最大值