python - 在 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))])
解决方案
如果您逐个元素地使用迭代器,为什么要将它转换为数组或列表?
以下应该也可以工作:
for i in itertools.product(range(N), repeat=int(N*np.log2(N))):
...
推荐阅读
- regex - 正则表达式:匹配重复的字符,包括一次出现
- php - 如何以这种格式对php进行base64编码?
- c# - 移动和剪切文件夹 INSIDE 监视的文件夹 C#
- docker-compose - 本地主机上的 Cookie 身份验证 Couchdb
- html - 如何设置 div 样式以使其看起来像我附加的图像
- vba - 循环对象图像以更改背景颜色
- eclipse - 我可以在断开连接后为正在运行的 Eclipse 会话重新创建 X 窗口吗?
- mongodb - 在 mongodDB 中查询日期
- linux - 如何使用 -x 参数调用 arm-none-eabi-gdb
- java - Java中二维数组的初始化?