排列字符列表占用了我所有的内存(Python)

排列字符列表占用了我所有的内存(Python),python,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(looku

我正在建立一个包含所有字母和数字的字典。这段代码的问题是在几秒钟内消耗了我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台机器。没有人能计算出这么大的数字。只是尝试一下,如果在某种程度上可能的话,

有36个/36-10! = 922393263052800 10个字母数字字符的1千万次排列。当然这会占用你所有的记忆

假设在64位机器上,每个字符串需要32个字节来存储指针的8个字节、长度的8个字节、内容的16个字节*,这需要26.2的内存

没有办法将所有排列存储在普通机器中。请说明你真正想做什么

*:实际上,它需要的远不止这些,因为还有类型信息,在Python3.x中,UTF-16需要2个字节的字符,列表本身也需要内存


即使只使用字母表,排列的数量仍然是19275223968000~20万亿,每个字符串32个字节仍然需要561 TiB的内存。

有36个/36-10! = 922393263052800 10个字母数字字符的1千万次排列。当然这会占用你所有的记忆

假设在64位机器上,每个字符串需要32个字节来存储指针的8个字节、长度的8个字节、内容的16个字节*,这需要26.2的内存

没有办法将所有排列存储在普通机器中。请说明你真正想做什么

*:实际上,它需要的远不止这些,因为还有类型信息,在Python3.x中,UTF-16需要2个字节的字符,列表本身也需要内存


即使只有字母表,排列的数量仍然是19275223968000~20万亿,每个字符串32字节仍需要561 TiB内存。

您应该利用云来解决这个问题。使用GNUparallel将为您提供额外的资源来帮助您构建字典

你应该利用云来解决这个问题。使用GNUparallel将为您提供额外的资源来帮助您构建字典

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


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

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


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

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

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

如果要使用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)

如果你要使用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)

首先,有一个名为dictionary的变量,它实际上是一个列表,这非常令人困惑

假设你有足够的内存,使用起来会快得多

dictionary = list(permutations(lookup, 10))

然而,由于您没有足够的内存,这将更快地使用您的内存。

首先,有一个名为dictionary的变量,它实际上是一个列表,非常混乱

假设你有足够的内存,使用起来会快得多

dictionary = list(permutations(lookup, 10))

然而,由于您没有足够的内存,这只会更快地使用您的内存

您确实意识到这些字符有922393263052800种可能的排列,对吗?可能我不会进行所有计算。只要说10个字符,你就需要重新思考为什么要把它们放在字典里。在没有实际存储的情况下迭代置换非常容易,这是O1而不是On!。你打算如何处理结果?我能想到的这种排列的唯一用途就是黑客。我是一个受过良好教育的人。没有黑客攻击的意图。这实际上是不可能的,即使我有

100台机器。没有人能计算出这么大的数字。我只是在尝试,如果可能的话。你知道有922393263052800个可能的字符排列,对吧?也许我不会做所有的计算。只要说10个字符,你就需要重新思考为什么要把它们放在字典里。在没有实际存储的情况下迭代置换非常容易,这是O1而不是On!。你打算如何处理结果?我能想到的这种排列的唯一用途就是黑客。我是一个受过良好教育的人。没有黑客攻击的意图。这实际上是不可能的,即使我有100台机器。没有人能计算出这么大的数字。我只是想尝试一下在某种程度上是否可能。如果你好奇的话,我制作了1000000份['a']*10作为内存估算并从中推断,但我当然不保证我的数学……实际上,OP将它们存储为字符串,而不是数组,所以这是不对的。无论如何,这个解决方案可能超出了他的预算。如果你好奇的话,我制作了1000000份['a']*10作为内存估算并从中推断,但当然我对我的数学没有任何保证……实际上,OP将它们存储为字符串,而不是数组,所以这是不对的。无论如何,这个解决方案可能超出了他的预算。是的,我做到了。如果我愚蠢的回答是对愚蠢问题的不恰当回答,我很抱歉。可能它没有回答我的问题。但我对GNU Parallel有所了解。谢谢,我做到了。如果我愚蠢的回答是对愚蠢问题的不恰当回答,我很抱歉。可能它没有回答我的问题。但我对GNU Parallel有所了解。感谢根据其他答案,磁盘空间量是不切实际的。处理这种顺序的唯一方法是在生产过程中处理每一件东西,而不要试图保留全部。即使这样,我们也只能计算出总数的一小部分,但计算起来要慢一些。在我看来,算法试图在最佳的时间和空间内实现它们的目标。然而,在实践中,这两个目标相互矛盾。一方必须付出才能容纳另一方。他可以访问PB级的磁盘空间。也许不是,但也许他工作的公司有一个超级计算机集群,有一个巨大的SAN或其他东西无论如何,他更可能拥有磁盘而不是RAM!根据其他答案,磁盘空间量是不切实际的。处理这种顺序的唯一方法是在生产过程中处理每一件东西,而不要试图保留全部。即使这样,我们也只能计算出总数的一小部分,但计算起来要慢一些。在我看来,算法试图在最佳的时间和空间内实现它们的目标。然而,在实践中,这两个目标相互矛盾。一方必须付出才能容纳另一方。他可以访问PB级的磁盘空间。也许不是,但也许他工作的公司有一个超级计算机集群,有一个巨大的SAN或其他东西无论如何,他更可能拥有磁盘而不是RAM!