【问题标题】:Python itertool variations, memory maximum reachedPython itertool 变体,达到最大内存
【发布时间】:2015-07-27 18:22:51
【问题描述】:

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

| 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 位文件)?

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

【问题讨论】:

    标签: python memory-management itertools variations


    【解决方案1】:

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

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

    或者,您可以使用 generator 代替功能等效的

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

    【讨论】:

    • 您已经很好地确定了问题所在。但是我想知道为什么他使用itertools.product而不是使用xrange,将strzfill转换为宽度?
    • 我使用的是 itertools,因为它是先前询问的有关如何生成所有带有 reptition 的变体的问题的答案。我以前没有听过这个术语。 Itertools 在产生所有可能数字的结果的 anwser 中(在这种情况下,也包括字母或其他字符)。我想有一种更简单的方法可以在没有模块的情况下做到这一点,但它不在 anwsers =/
    【解决方案2】:

    当您构造variants 列表时,您会将所有字符串放入内存中。当您在内存中有 10^7 或更多字符串时,您将开始用尽它是有道理的。您要做的是遍历迭代器并一次写出一个字符串。这会在您收到您的意见后开始。

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

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 2010-10-17
      • 2018-03-29
      • 1970-01-01
      • 2015-04-03
      • 2019-01-06
      • 2015-12-18
      • 2020-06-22
      • 2011-03-31
      相关资源
      最近更新 更多