python循环中的内存管理

2024-06-08 14:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个要求,我需要在梯子的方式循环。看起来像这样

for i in [i1,i2,.....]:
    for j in [j1,j2,.....]:
        for k in [k1,k2,.....]:
            for l in [l1,l2,.....]:
                for m in [m1,m2,.....]:
                        loop_variables = some computation on i,j,k,l,m
                        np.save('matrix.npy',loop_variables)

这个密码让我的笔记本电脑冻结了。因此,我以以下方式使用了itertoolsdelgc

import itertools
import gc
i = [i1,i2,.....]
j = [j1,j2,.....]
k = [k1,k2,.....]
l = [l1,l2,.....]
m = [m1,m2,.....]
lst = [i,j,k,l,m]
f_lst = itertools.product(*lst)
del i,j,k,l,m, lst
for i,j,k,l,m in f_lst:
    loop_variables = some computation on i,j,k,l,m
    np.save('matrix.npy',loop_variables)
    del loop_variables, i,j,k,l,m
    gc.collect()

但问题依然存在。我有以下问题

  1. 以上代码在解决梯形图循环方面是否更好
  2. 我应该如何更改上述代码,使其在特定时间后不会冻结

Tags: inloopfor方式k2k1variablesgc
1条回答
网友
1楼 · 发布于 2024-06-08 14:25:23

每次打开文件都要付出代价

通常,在内环中使用的CPU数量与减少CPU使用所消耗的RAM数量之间存在权衡。i、 e.您是否收集结果并稍后写出(收集时可能会耗尽内存)

下面是一个jupyter笔记本的结果,它是您示例的一个精简版本。使用“with”可以大大加快速度

import numpy as np
import os

%%timeit
try:
    os.remove('a.npy')
except:
    pass
for i in range(10):
    for j in range(10):
        x = np.arange(10)
        np.save('a.npy', x)
# 36 ms ± 746 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
try:
    os.remove('b.npy')
except:
    pass
with open('b.npy', 'wb') as f:
    for i in range(10):
        for j in range(10):
            x = np.arange(10)
            np.save(f, x)
# 11.9 ms ± 184 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

编辑:numpy文档指示保存附件,但是“a.npy”和“b.npy”的大小不同,因此。。。我不相信a.npy

相关问题 更多 >