Python itertool 变体,已达到内存最大值

Python itertool variations, memory maximum reached

我目前正在寻找生成具有特定位数的数字列表,我的代码目前如下:

| Python2.7 |

import itertools

inp = raw_input('Number of digits to write?:')
inp = int(inp)
inp2 = raw_input('File name?:')
inp2 = inp2 + '.txt'
variants = ["".join(item) for item in itertools.product("0123456789", repeat=inp)]

variant = open(inp2, 'w')

for number in variants:
    variant.write("%s\n" % number)

如您所见,我正在尝试生成多个不同的文件,并为每个新数字逐行放置输出。

我知道该列表可能有问题,因为它将所有可能的数字存储在该列表的内存中。我的问题是:数字超过 7,存在内存问题,我将如何减少所需的内存或将多个文件放在一起以生成具有相同类型数据的列表。

如果不使用这个特定的 itertools 实现,for 循环是否可以在本质上 'append' 将两个列表一起工作(比如 4 位数字文件和 5 位数字文件创建一个 9 位数字文件)?

也许是某种递归? (我仍然不明白如何编写递归函数等。在一般编程方面我是菜鸟)

只需按预期使用迭代器...迭代器的全部意义在于不要立即将所有内容存储在内存中...

variants = itertools.product("0123456789", repeat=inp)

variant = open(inp2, 'w')

for number in variants:
    variant.write("%s\n" % (" ".join(number))

或者,您可以使用 生成器 而不是功能等效的

variants = ("".join(item) for item in itertools.product("0123456789", repeat=inp)) #now its a generator expression


with open("outfile","wb") as variant:
    for number in variants:
        variant.write("%s\n"%number)

如前所述,您可以更轻松地做到这一点,因为

max_value = 10**n
with open("outfile","wb") as variant:
    for number in xrange(max_value):
        variant.write("{0:09d}\n".format(number))

构建 variants 列表时,您会将所有字符串放入内存。当内存中有 10^7 或更多字符串时,从 运行 开始就可以了。您要做的是遍历迭代器并一次写出您的字符串。这在您获得输入后开始。

variants = itertools.product('0123456789',repeat=inp)
outfile = open(inp2,'w')
for group in variants:
   outfile.write("%s\n" % (''.join(group)))