def datas(cal_mode):
'''
:param cal_mode: 计算公式
:return:
'''
# for循环前面有很多代码
for x in range(5):
td=x
# 公式=td*2 # 这里的计算公式是不固定的,需要根据模式选择不同的计算公式, 可能td+2 或者更复杂
print(td*2)
# for循环后面也有很多代码
我的mode函数似乎要放在循环内,每次去判断,又很啰嗦的感觉,因为公式选择了就固定了,不需要每次循环判断
def mode_a(td):
return td*2
def mode_b(td):
return td+2
def mode_c(td):
return td+2*2
如上伪装代码,我希望在不同cal_mode模式下选择不同的公式,但是如果每次在循环内判断选择计算模式,for循环如果很大,就很浪费。
里面的td依赖于for循环,不知道如何提取出去?
有没有简单的办法,我不想每个计算公式都重写一份代码
可以将函数作为参数传给前面的函数。
于是就在代码末尾加入了python回收机制gc,手动回收。
del data,c_data
gc.collect()
看看代码执行后生成的memory_profiler.log 文件
line 是第几行代码运行完后增加的内存,可以看到这里加载tensorflow的库后增加了136mb内存。
可以看到对生成数据进行回收,但是结果并没有减少到内存,显示累计使用内存数还是324m。
说明并不是中间数据量大的问题,在正常使用完data,clean_d这些数据后,内存就会被自动回收了。
另外一个需要注意的地方就是正常在导入各个库的时候,一个进程只会加载一次,也就是在同个进程中,第一次import tensorflow 的时候需要消耗内存,剩下的任务就不需要再加载tensorflow消耗内存了。
为了看到对比,对相同的任务,在同个进程中执行了3次。
我们依次看看结果。
可以看到在执行第二个任务的时候,内存的消耗还是保持324m,就算是import 库 也不会再增加内存了。
也就是这部分内存是常驻内存。
在第三次任务结束的时候,可以看到消耗内存如下
其实并没有增加多少。
这里是因为我还没将模型加载的部分放到代码里面。
上面只是为了测试中间数据是否有被回收掉。