我最近完成了遗传算法。Algo创建了50个测试用例的列表,并通过模拟进行试验,并存储结果。我使用许多自定义类,并且存储的结果包含类实例的列表。
当我运行此模拟时,除了永远使用之外,它将运行我的内存使用率高达90 %。我的代码中一定有一个只是在刺激内存,但我不确定如何找到它。这是我代码的主要部分,循环内部循环中的循环....
# ----------------------------------------------------------------------------------------------------
for i in range(1,numberOfRunsToSolve,1): # begin genetic algo loop
temp = trial_cases
for ii, stored_trial in enumerate(temp): # run through stored trial cases
new_trials = []
for jj in range(1,numberOfTrialsPerRound):
tc = []
tc = randomTrials_GenAlgo_ARRAY(stored_trial, True) # create new trial set, based on indexed stored results
new_trials.append(tc)
print(new_trials)
for j, trial in enumerate(new_trials):
x = OneGenerationSimulation(trial) #returns [ObjArray, ErrorArray]
rev = revenueAndLoss(x[0])
DEBUG_ARRAY.append(str(revenue)+' trial: ' + str(trial))
results.append((revenue, trial, x[0],x[1]))
results.sort(reverse=True) # sort to bring best revenue to top
results = results[0:numberOfResultsToKeepPerRound-1]
trial_cases = []
for i, r in enumerate(results):
trial_cases.append(r[1])
# end of the genetic algo loop
# ----------------------------------------------------------------------------------------------------
有什么建议如何跟踪脚本中的内存使用情况,并追捕罪魁祸首?我是Python的新手,所以请随时陈述显而易见的情况。
编辑:上面的过程实质上是这样做的:1)创建50次试用。
2)对每个试验进行模拟。该仿真创建数百个自定义对象,并在其上运行脚本,从而返回结果。3)所有结果都会返回,可以找回最佳的5个结果。4)使用这5个结果,创建新的试验集,然后重复该过程。
我担心质量对象实例的创建,然后将其过滤至最佳5个结果,在内存或其他方面没有正确清理...并且所有这些对象都隐藏在后台....
谢谢-KC。
这是您可以使用的快速且肮脏的插入排序。您可以将此代码内联而不是功能,以避免函数呼叫开销。
def top_insert(my_list, item, keep_only = 10):
rev = item[0]
newlist = [ i for i in my_list if i[0] > rev]
if len(newlist) >= keep_only:
return newlist[:keep_only]
elif len(newlist) == (keep_only - 1):
return newlist + [item]
else:
return newlist + [item] + my_list[len(newlist):keep_only-len(newlist)-1]