首页 > 解决方案 > 在 forloop 中计算 itertools 以停止 MemoryError 的方法

问题描述

以下代码由于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 函数从某些计算中返回真或假,并将其附加到列表 b 以供稍后分析


编辑(对评论的回答)

评论1)

np.array需要一份清单吗?它不会接受任何itertools.product回报吗?

itertools 必须有一个列表来解包/任何东西(即将值拖出对象),因为没有列表会导致错误TypeError: iteration over a 0-d array

评论2)

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

我明白你的意思,如果我稍微改变我的问题,说我知道我有一个持续 x = N**(log2(N)*N) 的 for 循环,你知道 itertools 是否让你itertools.product计算出循环数 x?希望这是有道理的...

评论 3)

只是好奇...TWFclass和是什么TFWm?你的课吗?我不知道图书馆的一部分?

不,这是我自己的类,其中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))])

标签: pythonitertools

解决方案


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

以下应该也可以工作:

for i in itertools.product(range(N), repeat=int(N*np.log2(N))):
    ...

推荐阅读