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