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

标签 python memory-management python-itertools

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

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

在不使用这个特定的 itertools 实现的情况下,for 循环本质上是否可以将两个列表“附加”在一起(例如 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))

关于Python itertool 变体,达到内存最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660477/

相关文章:

python - 在 PyTorch 中计算张量/外积空间中的线性层非常慢

python - Numpy 向量化索引之和

c++ - 内存要求 : N-point FFT (getting error)

memory - 哪些应用程序需要 1GB 页面?

Python itertools - 只创建所有可能产品的一个子集

Python:当列表仅在运行时确定时,如何将可迭代列表传递给 zip?

python - 将转义字符写入文件

python - 在 Python 中交互运行外部可执行文件

python - 如何确定函数的 CPU 和内存成本?

python - 使用其他列表的 3 个重复元素的组合创建列表