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

时间:2015-07-27 18:22:52

标签: python memory-management itertools variations

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

| Python 2.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,则存在内存问题,我将如何减少所需内存或将多个文件放在一起以生成具有相同类型数据的列表。

for循环工作本质上是'追加'两个列表在一起(比如4位数文件和5位数文件创建基本上是9位数的文件)而没有使用这个特定的itertools实现?

也许是某种递归? (我仍然不明白如何编写递归函数等。一般来说,编程就是一个菜鸟)

2 个答案:

答案 0 :(得分:2)

只是使用迭代器作为预期使用...迭代器的重点是不要一次将所有内容存储在内存中......

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))

答案 1 :(得分:1)

构建variants列表时,您将所有字符串放入内存。当你在内存中有10 ^ 7或更多的字符串时,你可能会开始在它上面运行不足。你想要做的就是通过迭代器并一次写出一个字符串。这是在您收到您的意见后开始的。

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