在forloop中计算itertools的方法来停止MemoryError

时间:2019-03-31 14:02:21

标签: python itertools

以下代码由于MemoryError而失败。我相信这是因为它是一次性计算出itertools部分。是否可以将itertools与for循环一起计算出来,以避免填满我的RAM。

(或者是获得更大计算机的唯一选择!)

请告知-


N = 8
a = TWFclass(N)
b = []
c = np.zeros_like(a.TWFm)
for i in np.array(list(itertools.product(range(N), repeat=int(N*np.log2(N))))):
    a.change(i.reshape(N, int(np.log2(N))))
    if a.check(16):
        b.append(a.TWFm)

有关代码的一些信息:

-itertools语句为矩阵a.TWFm生成一个数字

-然后通过.change函数将其分配给a.TWFm

-。check函数从某些计算中返回true或false,将其附加到列表b以便稍后进行分析


编辑(评论的答案)

评论1)

np.array是否需要列表? itertools.product不会返回什么?

itertools必须有一个列表以进行解压缩/其他操作(即将值拖出对象),因为没有列表会导致错误TypeError: iteration over a 0-d array

评论2)

我很确定您不能有一个“惰性”数组;无论是给它一个列表还是一个生成器作为参数(即使支持),结果数组都将把所有数据存储在内存中(尽管要尽可能紧凑地存储)。

如果我稍微改变我的问题以说我知道我有一个持续x = N **(log2(N)* N)的for循环,我可以理解你的意思,你知道itertools是否可以使你工作循环号x的单个itertools.product?希望有道理...

评论3)

很好奇... TWFclassTFWm是什么?在上课吗我不知道是图书馆的一部分吗?

不,这是我自己的班级,其中TWFm是(N,log2(N))的矩阵,而TWFclass是班级名称...

即我有

class TWFclass(N):
    def __init__(self, N):
        self.N = N
        self.TWFm = np.zeros([self.N, int(np.log2(self.N))])

1 个答案:

答案 0 :(得分:1)

如果您逐个使用迭代器,为什么要将迭代器转换为数组或列表?

以下内容同样适用:

E