首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免关于Python中的置换的MemoryError

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

Stack Overflow用户
提问于 2015-06-07 05:20:52
回答 2查看 1.7K关注 0票数 2

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

代码语言:javascript
运行
复制
>>> import itertools
>>> o = itertools.permutations("abcdefghijklmnoprstuvyzwxq1234567890_", 10)
>>> a = list(o)

我得到了这个错误:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
EN

回答 2

Stack Overflow用户

发布于 2015-06-07 05:29:47

更新:

首先,如果你想从这个字母表中得到所有可能的密码,你应该使用itertools模块中的product函数,而不是permutations

另外,如果你想提高执行速度,你应该使用multiprocessing模块而不是threading

你可以这样实现你的目标,例如:

代码语言:javascript
运行
复制
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

原始答案:

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

代码语言:javascript
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2015-06-07 05:30:06

不要创建排列的“列表”。“排列”调用是一个特殊的构造,它将一次生成一个排列--其思想是你消费它,然后检索下一个值。

当你这样做的时候

代码语言:javascript
运行
复制
>>> a = list(o)

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30687688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档