我正在构建一个包含所有字母和数字的字典。这段代码的问题是“在第二件事中消耗了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台机器,这实际上也是不可能的。没人能计算这么大的数字。只是在某种程度上可以尝试
答案 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))
但是,由于你没有足够的内存,这只会更快耗尽内存