置换字符列表会占用我所有的内存(Python)

时间:2010-11-12 17:52:50

标签: python

我正在构建一个包含所有字母和数字的字典。这段代码的问题是“在第二件事中消耗了100%的记忆”。你觉得我的实施不好吗? 任何帮助表示赞赏。

from timeit import Timer
from itertools import permutations
dictionary = []
small_alpha = map(chr, range(97,123))

lookup.append(small_alpha)

def test():
    for i in permutations(lookup, 10):
        dictionary.append(''.join(i))

if __name__ == '__main__':
    test()

(编辑)的 我受过良好的教育。没有黑客的意图。即使我有100台机器,这实际上也是不可能的。没人能计算这么大的数字。只是在某种程度上可以尝试

6 个答案:

答案 0 :(得分:10)

有36个!/(36-10)! = 1022个字母数字字符的922,393,263,052,800个排列(~1千万亿)。当然这将占用你所有的记忆。

假设每个字符串需要32个字节来存储(指针为8个字节,长度为8个字节,内容为16个字节*,在64位计算机上),这需要26.2 PiB个内存。

无法将所有排列存储在普通计算机中。请说明你真正想做的事情。

(*:实际上它需要更多,因为还有类型信息,在Python 3.xa字符中,UTF-16需要2个字节,列表本身也需要内存。)


即使只使用字母表,排列的数量仍然是19,275,223,968,000(~20万亿),并且每串32字节仍需要561 TiB的内存。

答案 1 :(得分:2)

您需要大约90077467 GB的内存来存储结果数据。

2 GB的内存价格为13美元(http://www.newegg.com/Product/Product.aspx?Item=N82E16820146214),因此您可以轻松解决这个问题,价格低至585,503,535.50美元。

答案 2 :(得分:2)

你正在做的事情非常正确,使用itertools提供生成器而不是实际生成列表 - 直到你尝试创建列表。这个列表只会耗尽你所有的记忆,因为它实际上是巨大的。您应该将其写入文件而不是尝试在内存中创建列表,但是您需要 lot 的磁盘空间。

答案 3 :(得分:2)

如果你打算使用itertools,那就一直使用它!

对于懒惰的生成器来说,这是一个完美的情况 - 无需实际存储排列或数据。

import itertools

small_alpha = itertools.imap(chr, range(97, 123))
numbers = itertools.imap(chr, range(48, 58))
lookup = itertools.chain(small_alpha, numbers)
d = (''.join(i) for i in itertools.permutations(lookup, 10))

if __name__ == '__main__':
    perms = list(itertools.islice(d,10))
    print(perms)

答案 4 :(得分:0)

你应该利用云来解决这个问题。使用gnu parallel会为您提供额外的资源来帮助您构建字典。 http://unethicalblogger.com/posts/2010/11/gnuparallel_changed_my_life

答案 5 :(得分:0)

首先让名为字典的变量真的是list非常令人困惑

假设你有足够的内存,使用

会快得多
dictionary = list(permutations(lookup, 10))

但是,由于你没有足够的内存,这只会更快耗尽内存