微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python循环中的内存管理

如何解决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,.....]
j = [j1,.....]
k = [k1,.....]
l = [l1,.....]
m = [m1,.....]
lst = [i,m]
f_lst = itertools.product(*lst)
del i,m,lst
for i,m in f_lst:
    loop_variables = some computation on i,m
    np.save('matrix.npy',loop_variables)
    del loop_variables,i,m
    gc.collect()

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

  1. 上面的代码解决阶梯循环方面是否更好
  2. 我应该如何更改上面的代码,使其在一定时间后不会冻结。

解决方法

每次打开文件都会产生费用。

一般而言,在内循环中使用多少 CPU 与为减少 CPU 使用而消耗多少 RAM 之间存在权衡。即您是否收集结果并稍后写出(并且可能在收集时耗尽内存)。

以下是示例的修剪版本的 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 doc's 表示保存附加但是'a.npy'和'b.npy'的大小不同所以......我不信任'a.npy'。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。