Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的内存错误-如何使用更少的内存? 导入字符串 来自itertools进口产品 l=字符串。ascii字母+字符串。数字+'-'+''''' def组合(a,次): 梳=列表(产品(a,重复=次数)) i=0 a=[] 而(i_Python_Python 3.x - Fatal编程技术网

Python中的内存错误-如何使用更少的内存? 导入字符串 来自itertools进口产品 l=字符串。ascii字母+字符串。数字+'-'+''''' def组合(a,次): 梳=列表(产品(a,重复=次数)) i=0 a=[] 而(i

Python中的内存错误-如何使用更少的内存? 导入字符串 来自itertools进口产品 l=字符串。ascii字母+字符串。数字+'-'+''''' def组合(a,次): 梳=列表(产品(a,重复=次数)) i=0 a=[] 而(i,python,python-3.x,Python,Python 3.x,我有一个随机散列字符串,最多可以有10个字符,我想检查每个字符串的可能性,散列它,并比较散列,直到我得到字符串。但是,当我想拥有4个字符的字符串的所有可能性时,它会给我一个内存错误。我想要最多10个字符 这是我得到的错误: import string from itertools import product l = string.ascii_letters+string.digits+'-'+'_' def combinations(a,times): comb = list

我有一个随机散列字符串,最多可以有10个字符,我想检查每个字符串的可能性,散列它,并比较散列,直到我得到字符串。但是,当我想拥有4个字符的字符串的所有可能性时,它会给我一个内存错误。我想要最多10个字符

这是我得到的错误:

import string
from itertools import product

l = string.ascii_letters+string.digits+'-'+'_'    
def combinations(a,times):
    comb = list(product(a, repeat=times))
    i = 0
    a = []
    while(i < len(comb)):
        s = ''.join(comb[i])
        a.append(s)
        i+=1
    return a
a = combinations(l,4)
print(a)
回溯(最近一次呼叫最后一次):
文件“source_File.py”,第14行,在
a=组合(l,4)
文件“source_File.py”,第6行,以组合形式
梳=列表(产品(a,重复=次数))
记忆者
像这样。。。 为了节省内存,您需要使用生成器,这样整个列表就不会存储在内存中

Traceback (most recent call last):
File "source_file.py", line 14, in <module>
    a = combinations(l,4)
File "source_file.py", line 6, in combinations
    comb = list(product(a, repeat=times))
MemoryError
你可以这样使用它

def combinations(a,times):
    for combination in product(a, repeat=times):
        yield ''.join(combination)
但是
你不再是没有记忆了,现在你将没有时间了。十个字符的字符串有64^10个组合。即115292150406846976。在你的一生中,你很可能永远都不会到达这个生成器的尽头。

你做过数学计算吗,以了解你试图创建多少种可能的组合?64个字符乘以64个字符乘以64个字符乘以64个字符可生成16777216个不同的字符串。只有四个。有了五个,它就变成了1073741824个不同的字符串。每个字符串占用五个字节(加上可能稍微多一点的开销)。这是5368709120字节,用于保存5个字符组合的字符串。@BryanOakley如何修复它?这取决于您对“修复”的定义。如果您将它们写入disk one,然后将它们从内存中丢弃,您只需要大量的磁盘空间。如果要同时将它们都保存在内存中,则需要大量的系统内存。如果您不需要保留任何字符串(例如,只需一次打印一个),您可以一次打印一个或使用生成器。如果您通过生成所有可能的字符串来实现这一点,请准备好等待几年的答案。如果这是你真正的目标,那么修改你的问题来解释你在做什么,以便有人能告诉你如何解决这个问题,而不是生成数十亿个随机字符串的问题。你有没有想过买一台量子计算机?那在我的计算机上大概有20000年了,只是重复一下…:\
l = string.ascii_letters+string.digits+'-'+'_' 
combination_generator = combinations(l, 4)

# This will work, but takes a few minutes
for c in combination_generator:
    print(c)