生成长度为 6 的字母和数字的所有可能组合时出现 MemoryError
MemoryError when generating every possible combination of letters and numbers with a length of 6
我正在尝试输出字母和数字的所有可能的 6 种长度组合的列表。
我已经尝试过许多不同类型的代码,这个似乎是最好的,但它不适用于我使用的很长的长度。
import itertools
import pprint
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9"]
pprint.pprint(list(itertools.product(letters, repeat=6)))
当我运行这个时,我得到这个错误:
MemoryError
它确实适用于将重复设置为小于 5 的值。
我该如何解决这个问题?有没有更简单或更好的方法来获得相同的结果?是否可以只将其输出到文本文件而不必打印它?有没有重复我不在乎,如果没有重复就好了。
这个站点:textmechanic.com/Combination-Generator.html 也做同样的事情,但它不适用于我正在使用的大量对象和组合的长度.如果已经有这样的列表,那就可以了。
还是根本不可能完成?
您正在尝试创建一个列表,其中包含 36 ** 6 = 2176782336 个由 6 个 1 字符字符串组成的元组。那就是超过 20 亿(2 亿)。这需要至少 210 GB 的内存,只是 来保存元组对象(在我的 Mac 上每个对象小 104 个字节)。
不要试图列出清单;打印生成的值,然后再次丢弃它们:
for combo in itertools.product(letters, repeat=6):
print(''.join(combo))
要将其写入文件,请写入 str.join()
结果加上换行符:
with open('outputfile.txt', 'w') as outfile:
for combo in itertools.product(letters, repeat=6):
outfile.write(''.join(combo) + '\n')
这需要很少的 RAM,但是您需要 14GB 的磁盘 space 来存储 20 亿乘以 7 的字符(包括换行符)。
您实际上是在要求在一个列表中预先生成所有此类组合,然后一次性打印它们。
您可以做的是通过不调用 list(...)
而是在迭代器生成它们时即时打印它们来避免这种情况。
这是一个例子。它不是原始格式,但可以完成工作。
import itertools
import pprint
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9"]
for item in itertools.product(letters, repeat=6):
pprint.pprint(item)
我正在尝试输出字母和数字的所有可能的 6 种长度组合的列表。
我已经尝试过许多不同类型的代码,这个似乎是最好的,但它不适用于我使用的很长的长度。
import itertools
import pprint
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9"]
pprint.pprint(list(itertools.product(letters, repeat=6)))
当我运行这个时,我得到这个错误:
MemoryError
它确实适用于将重复设置为小于 5 的值。
我该如何解决这个问题?有没有更简单或更好的方法来获得相同的结果?是否可以只将其输出到文本文件而不必打印它?有没有重复我不在乎,如果没有重复就好了。
这个站点:textmechanic.com/Combination-Generator.html 也做同样的事情,但它不适用于我正在使用的大量对象和组合的长度.如果已经有这样的列表,那就可以了。
还是根本不可能完成?
您正在尝试创建一个列表,其中包含 36 ** 6 = 2176782336 个由 6 个 1 字符字符串组成的元组。那就是超过 20 亿(2 亿)。这需要至少 210 GB 的内存,只是 来保存元组对象(在我的 Mac 上每个对象小 104 个字节)。
不要试图列出清单;打印生成的值,然后再次丢弃它们:
for combo in itertools.product(letters, repeat=6):
print(''.join(combo))
要将其写入文件,请写入 str.join()
结果加上换行符:
with open('outputfile.txt', 'w') as outfile:
for combo in itertools.product(letters, repeat=6):
outfile.write(''.join(combo) + '\n')
这需要很少的 RAM,但是您需要 14GB 的磁盘 space 来存储 20 亿乘以 7 的字符(包括换行符)。
您实际上是在要求在一个列表中预先生成所有此类组合,然后一次性打印它们。
您可以做的是通过不调用 list(...)
而是在迭代器生成它们时即时打印它们来避免这种情况。
这是一个例子。它不是原始格式,但可以完成工作。
import itertools
import pprint
letters = ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9"]
for item in itertools.product(letters, repeat=6):
pprint.pprint(item)